您好,登錄后才能下訂單哦!
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í)有所幫助,也希望大家多多支持億速云。
免責(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)容。