使用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.txt1,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:千分位分隔符,如","或"."。