溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

使用pandas讀取文件的實(shí)現(xiàn)

發(fā)布時(shí)間:2020-09-07 20:53:12 來(lái)源:腳本之家 閱讀:572 作者:修煉之路 欄目:開(kāi)發(fā)技術(shù)

pandas可以將讀取到的表格型數(shù)據(jù)(文件不一定要是表格)轉(zhuǎn)成DataFrame類型的數(shù)據(jù)結(jié)構(gòu),然后我們可以通過(guò)操作DataFrame進(jìn)行數(shù)據(jù)分析,數(shù)據(jù)預(yù)處理以及行和列的操作等。下面介紹一些常用讀取文件的方法

1、read_csv函數(shù)

功能:從文件、URL、文件新對(duì)象中加載帶有分隔符的數(shù)據(jù),默認(rèn)分隔符是逗號(hào)。

data.txt

a,b,c,d,name
1,2,3,4,python
5,6,7,8,java
9,10,11,12,c++
  data = pd.read_csv("data.txt")
  print(data)
  '''
    a  b  c  d  name
  0 1  2  3  4 python
  1 5  6  7  8  java
  2 9 10 11 12   c++
  '''

2、read_table函數(shù)

功能:從文件、URL、文件型對(duì)象中加載帶分隔符的數(shù)據(jù),默認(rèn)分隔符為制表符("\t")。
data.txt的內(nèi)容還是不變,我們可以通過(guò)指定read_table的sep參數(shù)來(lái)修改默認(rèn)的分隔符。

  data = pd.read_table("data.txt",sep=",")
  print(data)
  '''
    a  b  c  d  name
  0 1  2  3  4 python
  1 5  6  7  8  java
  2 9 10 11 12   c++
  '''

3、讀取沒(méi)有標(biāo)題的文件

data.txt

1,2,3,4,python
5,6,7,8,java
9,10,11,12,c++
  data = pd.read_csv("data.txt")
  #默認(rèn)將第一行作為標(biāo)題
  print(data)
  '''
    1  2  3  4 python
  0 5  6  7  8  java
  1 9 10 11 12  c++
  '''
  #設(shè)置header參數(shù),讀取文件的時(shí)候沒(méi)有標(biāo)題
  data1 = pd.read_csv("data.txt",header=None)
  print(data1)
  '''
    0  1  2  3    4
  0 1  2  3  4 python
  1 5  6  7  8  java
  2 9 10 11 12   c++
  '''
  #設(shè)置names參數(shù),來(lái)設(shè)置文件的標(biāo)題
  data2 = pd.read_csv("data.txt",names=["a","b","c","d","name"])
  print(data2)
  '''
    a  b  c  d  name
  0 1  2  3  4 python
  1 5  6  7  8  java
  2 9 10 11 12   c++
  '''

4、讀取文件設(shè)置列索引

  #設(shè)置names參數(shù),來(lái)設(shè)置文件的標(biāo)題,設(shè)置index_col參數(shù)來(lái)設(shè)置列索引
  data2 = pd.read_csv("data.txt",names=["a","b","c","d","name"],index_col="name")
  print(data2)
  '''
      a  b  c  d
  name
  python 1  2  3  4
  java  5  6  7  8
  c++   9 10 11 12
  '''

如果不設(shè)置列索引,默認(rèn)會(huì)使用從0開(kāi)始的整數(shù)索引。當(dāng)對(duì)表格的某一行或列進(jìn)行操作之后,在保存成文件的時(shí)候你會(huì)發(fā)現(xiàn)總是會(huì)多一列從0開(kāi)始的列,如果設(shè)置index_col參數(shù)來(lái)設(shè)置列索引,就不會(huì)出現(xiàn)這種問(wèn)題了。

a、指定多個(gè)列為列索引產(chǎn)生一個(gè)層次化索引

一個(gè)值由兩個(gè)列索引(key1和kye2)和一個(gè)行索引(value1或value2)來(lái)決定,可以將其理解為一個(gè)三維數(shù)據(jù),三個(gè)點(diǎn)來(lái)構(gòu)成一個(gè)坐標(biāo)位置。

data.txt

key1,key2,value1,value2
a,a,1,2
a,b,3,4
b,c,5,6
b,d,7,8
c,e,9,10
c,f,11,12
 data = pd.read_csv("data.txt",index_col=["key1","key2"])
  print(data)
  '''
        value1 value2
  key1 key2
  a  a     1    2
     b     3    4
  b  c     5    6
     d     7    8
  c  e     9   10
     f     11   12
  '''

5、對(duì)于不規(guī)則分隔符,使用正則表達(dá)式讀取文件

文件中的分隔符采用的是空格,那么我們只需要設(shè)置sep=" "來(lái)讀取文件就可以了。當(dāng)分隔符并不是單個(gè)的空格,也許有的是一個(gè)空格有的是多個(gè)空格時(shí),如果這個(gè)時(shí)候還是采用sep=" "來(lái)讀取文件,也許你就會(huì)得到一個(gè)很奇怪的數(shù)據(jù),因?yàn)樗鼤?huì)將空格也做為數(shù)據(jù)。

data.txt

name a  b c  d
python  1 2 3   4
java 5 6 7 8
c++ 9  10  11 12
  data = pd.read_csv("data.txt",sep=" ")
  print(data)
  '''
      name  a Unnamed: 2 Unnamed: 3  b Unnamed: 5  c Unnamed: 7 \
  python  NaN NaN     1.0     NaN  2     3.0 NaN     NaN  
  java   5.0 6.0     NaN     7.0  8     NaN NaN     NaN  
  c++   NaN 9.0     NaN     NaN 10     NaN NaN    11.0  
  
      Unnamed: 8 Unnamed: 9  d 
  python     NaN     NaN 4.0 
  java      NaN     NaN NaN 
  c++      NaN    12.0 NaN 
  '''

使用正則表達(dá)式進(jìn)行分割就可以避免上面問(wèn)題的發(fā)生

  data = pd.read_csv("data.txt",sep="\s+")
  print(data)
  '''
     name a  b  c  d
  0 python 1  2  3  4
  1  java 5  6  7  8
  2   c++ 9 10 11 12
  '''

6、跳行讀取文件

有的時(shí)候,你會(huì)遇到表格中的某些行數(shù)據(jù)你并不需要??梢酝ㄟ^(guò)skiprows參數(shù)來(lái)跳過(guò)這些行。

data.txt

#data.txt
name,a,b,c,d
python,1,2,3,4
#hello
java,5,6,7,8
#word
c++,9,10,11,12
  #通過(guò)skiprows參數(shù)來(lái)設(shè)置跳過(guò)行,從0開(kāi)始
  data = pd.read_csv("data.txt",skiprows=[0,3,5])
  print(data)
  '''
     name a  b  c  d
  0 python 1  2  3  4
  1  java 5  6  7  8
  2   c++ 9 10 11 12
  '''

7、讀取含有缺失值的文件

使用pandas在讀取文件的時(shí)候,pandas會(huì)默認(rèn)將NA、-1.#IND、NULL等當(dāng)作是缺失值,pandas默認(rèn)使用NaN進(jìn)行代替。

data.txt

name,a,b,c,d
python,1,NA,3,4
java,5,6,7,NULL
c++,-1.#IND,10,,12
  data = pd.read_csv("data.txt")
  print(data)
  '''
     name  a   b  c   d
  0 python 1.0  NaN 3.0  4.0
  1  java 5.0  6.0 7.0  NaN
  2   c++ NaN 10.0 NaN 12.0
  '''

也許有的時(shí)候也許pandas默認(rèn)被當(dāng)作的缺失值還不能滿足你的要求,我們可以通過(guò)設(shè)置na_values,將指定的值替換成為NaN值

  data1 = pd.read_csv("data.txt",na_values=["java","c++"])
  print(data1)
  '''
     name  a   b  c   d
  0 python 1.0  NaN 3.0  4.0
  1   NaN 5.0  6.0 7.0  NaN
  2   NaN NaN 10.0 NaN 12.0
  '''

也許有時(shí)候你還會(huì)遇到,你想將某個(gè)值替換成為NaN,但是可能有多個(gè)列都包含了這個(gè)值,而我們卻不想替換所有的列,我們可以通過(guò)一個(gè)字典的形式來(lái)設(shè)置na_values參數(shù),字典的鍵就是列索引,值就是你要替換的值。

data.txt

name,a,b,c,d
python,1,NA,3,4
java,5,6,python,NULL
c++,-1.#IND,10,,c++
  #將python和c++都用NaN進(jìn)行替代,將所有的python和c++都替換成了NaN
  data1 = pd.read_csv("data.txt",na_values=["python","c++"])
  print(data1)
  '''
    name  a   b  c  d
  0  NaN 1.0  NaN 3.0 4.0
  1 java 5.0  6.0 NaN NaN
  2  NaN NaN 10.0 NaN NaN
  '''

只將第一列的python和c++替換為NaN

  #將python和c++都用NaN進(jìn)行替代
  dic = {"name":["python","c++"]}
  data1 = pd.read_csv("data.txt",na_values=dic)
  print(data1)
  '''
    name  a   b    c  d
  0  NaN 1.0  NaN    3  4
  1 java 5.0  6.0 python NaN
  2  NaN NaN 10.0   NaN c++
  '''

8、read_csv和read_tabel的參數(shù)介紹

read_csv和read_table函數(shù)有很多的參數(shù),下面對(duì)一些重點(diǎn)參數(shù)進(jìn)行介紹。

參數(shù):

path:表示文件系統(tǒng)位置、URL、文件型對(duì)象的字符串。

sep或delimiter:用于對(duì)行中各字段進(jìn)行拆分的字符序列或正則表達(dá)式。

header:用作列名的行號(hào)。默認(rèn)為0(第一行),如果文件沒(méi)有標(biāo)題行就將header參數(shù)設(shè)置為None。

index_col:用作行索引的列編號(hào)或列名。可以是單個(gè)名稱/數(shù)字或有多個(gè)名稱/數(shù)字組成的列表(層次化索引)。

names:用于結(jié)果的列名列表,結(jié)合header=None,可以通過(guò)names來(lái)設(shè)置標(biāo)題行。

skiprows:需要忽略的行數(shù)(從0開(kāi)始),設(shè)置的行數(shù)將不會(huì)進(jìn)行讀取。

na_values:設(shè)置需要將值替換成NA的值。

comment:用于注釋信息從行尾拆分出去的字符(一個(gè)或多個(gè))。

parse_dates:嘗試將數(shù)據(jù)解析為日期,默認(rèn)為False。如果為T(mén)rue,則嘗試解析所有列。除此之外,參數(shù)可以指定需要解析的一組列號(hào)或列名。如果列表的元素為列表或元組,就會(huì)將多個(gè)列組合到一起再進(jìn)行日期解析工作。

keep_date_col:如果連接多列解析日期,則保持參與連接的列。默認(rèn)為False。

converters:由列號(hào)/列名跟函數(shù)之間的映射關(guān)系組成的字典。如,{"age:",f}會(huì)對(duì)列索引為age列的所有值應(yīng)用函數(shù)f。

dayfirst:當(dāng)解析有歧義的日期時(shí),將其看做國(guó)際格式(例如,7/6/2012   ---> June 7 , 2012)。默認(rèn)為False。

date_parser:用于解析日期的函數(shù)。

nrows:需要讀取的行數(shù)。

iterator:返回一個(gè)TextParser以便逐塊讀取文件。

chunksize:文件塊的大?。ㄓ糜诘?。

skip_footer:需要忽略的行數(shù)(從文件末尾開(kāi)始計(jì)算)。

verbose:打印各種解析器輸出信息,如“非數(shù)值列中的缺失值的數(shù)量”等。

encoding:用于unicode的文本編碼格式。例如,"utf-8"或"gbk"等文本的編碼格式。

squeeze:如果數(shù)據(jù)經(jīng)過(guò)解析之后只有一列的時(shí)候,返回Series。

thousands:千分位分隔符,如","或"."。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持億速云。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI