1. 程式人生 > >使用pandas讀取檔案

使用pandas讀取檔案

pandas可以將讀取到的表格型資料(檔案不一定要是表格)轉成DataFrame型別的資料結構,然後我們可以通過操作DataFrame進行資料分析,資料預處理以及行和列的操作等。下面介紹一些常用讀取檔案的方法

1、read_csv函式

功能:從檔案、URL、檔案新物件中載入帶有分隔符的資料,預設分隔符是逗號。

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函式
功能:從檔案、URL、檔案型物件中載入帶分隔符的資料,預設分隔符為製表符("\t")。

data.txt的內容還是不變,我們可以通過指定read_table的sep引數來修改預設的分隔符。

    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、讀取沒有標題的檔案
data.txt
1,2,3,4,python
5,6,7,8,java
9,10,11,12,c++
    data = pd.read_csv("data.txt")
    #預設將第一行作為標題
    print(data)
    '''
       1   2   3   4 python
    0  5   6   7   8   java
    1  9  10  11  12    c++
    '''
    #設定header引數,讀取檔案的時候沒有標題
    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++
    '''
    #設定names引數,來設定檔案的標題
    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、讀取檔案設定列索引
    #設定names引數,來設定檔案的標題,設定index_col引數來設定列索引
    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
    '''
如果不設定列索引,預設會使用從0開始的整數索引。當對錶格的某一行或列進行操作之後,在儲存成檔案的時候你會發現總是會多一列從0開始的列,如果設定index_col引數來設定列索引,就不會出現這種問題了。
a、指定多個列為列索引產生一個層次化索引

一個值由兩個列索引(key1和kye2)和一個行索引(value1或value2)來決定,可以將其理解為一個三維資料,三個點來構成一個座標位置。

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、對於不規則分隔符,使用正則表示式讀取檔案

檔案中的分隔符采用的是空格,那麼我們只需要設定sep=" "來讀取檔案就可以了。當分隔符並不是單個的空格,也許有的是一個空格有的是多個空格時,如果這個時候還是採用sep=" "來讀取檔案,也許你就會得到一個很奇怪的資料,因為它會將空格也做為資料。

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  
    '''
使用正則表示式進行分割就可以避免上面問題的發生
    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、跳行讀取檔案

有的時候,你會遇到表格中的某些行資料你並不需要。可以通過skiprows引數來跳過這些行。

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

    #通過skiprows引數來設定跳過行,從0開始
    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在讀取檔案的時候,pandas會預設將NA、-1.#IND、NULL等當作是缺失值,pandas預設使用NaN進行代替。

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
    '''
也許有的時候也許pandas預設被當作的缺失值還不能滿足你的要求,我們可以通過設定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
    '''
也許有時候你還會遇到,你想將某個值替換成為NaN,但是可能有多個列都包含了這個值,而我們卻不想替換所有的列,我們可以通過一個字典的形式來設定na_values引數,字典的鍵就是列索引,值就是你要替換的值。

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進行替代,將所有的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進行替代
    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的引數介紹

read_csv和read_table函式有很多的引數,下面對一些重點引數進行介紹。

引數:

path:表示檔案系統位置、URL、檔案型物件的字串。

sep或delimiter:用於對行中各欄位進行拆分的字元序列或正則表示式。

header:用作列名的行號。預設為0(第一行),如果檔案沒有標題行就將header引數設定為None。

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

names:用於結果的列名列表,結合header=None,可以通過names來設定標題行。

skiprows:需要忽略的行數(從0開始),設定的行數將不會進行讀取。

na_values:設定需要將值替換成NA的值。

comment:用於註釋資訊從行尾拆分出去的字元(一個或多個)。

parse_dates:嘗試將資料解析為日期,預設為False。如果為True,則嘗試解析所有列。除此之外,引數可以指定需要解析的一組列號或列名。如果列表的元素為列表或元組,就會將多個列組合到一起再進行日期解析工作。

keep_date_col:如果連線多列解析日期,則保持參與連線的列。預設為False。

converters:由列號/列名跟函式之間的對映關係組成的字典。如,{"age:",f}會對列索引為age列的所有值應用函式f。

dayfirst:當解析有歧義的日期時,將其看做國際格式(例如,7/6/2012   ---> June 7 , 2012)。預設為False。

date_parser:用於解析日期的函式。

nrows:需要讀取的行數。

iterator:返回一個TextParser以便逐塊讀取檔案。

chunksize:檔案塊的大小(用於迭代)。

skip_footer:需要忽略的行數(從檔案末尾開始計算)。

verbose:列印各種解析器輸出資訊,如“非數值列中的缺失值的數量”等。

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

squeeze:如果資料經過解析之後只有一列的時候,返回Series。

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