使用pandas讀取文件的實現(xiàn)
pandas可以將讀取到的表格型數(shù)據(jù)(文件不一定要是表格)轉(zhuǎn)成DataFrame類型的數(shù)據(jù)結(jié)構(gòu),然后我們可以通過操作DataFrame進行數(shù)據(jù)分析,數(shù)據(jù)預(yù)處理以及行和列的操作等。下面介紹一些常用讀取文件的方法
1、read_csv函數(shù)
功能:從文件、URL、文件新對象中加載帶有分隔符的數(shù)據(jù),默認(rèn)分隔符是逗號。
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、文件型對象中加載帶分隔符的數(shù)據(jù),默認(rèn)分隔符為制表符("\t")。
data.txt的內(nèi)容還是不變,我們可以通過指定read_table的sep參數(shù)來修改默認(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、讀取沒有標(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ù),讀取文件的時候沒有標(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ù),來設(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ù),來設(shè)置文件的標(biāo)題,設(shè)置index_col參數(shù)來設(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)會使用從0開始的整數(shù)索引。當(dāng)對表格的某一行或列進行操作之后,在保存成文件的時候你會發(fā)現(xiàn)總是會多一列從0開始的列,如果設(shè)置index_col參數(shù)來設(shè)置列索引,就不會出現(xiàn)這種問題了。
a、指定多個列為列索引產(chǎn)生一個層次化索引
一個值由兩個列索引(key1和kye2)和一個行索引(value1或value2)來決定,可以將其理解為一個三維數(shù)據(jù),三個點來構(gòu)成一個坐標(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、對于不規(guī)則分隔符,使用正則表達式讀取文件
文件中的分隔符采用的是空格,那么我們只需要設(shè)置sep=" "來讀取文件就可以了。當(dāng)分隔符并不是單個的空格,也許有的是一個空格有的是多個空格時,如果這個時候還是采用sep=" "來讀取文件,也許你就會得到一個很奇怪的數(shù)據(jù),因為它會將空格也做為數(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 '''
使用正則表達式進行分割就可以避免上面問題的發(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ù)據(jù)你并不需要??梢酝ㄟ^skiprows參數(shù)來跳過這些行。
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參數(shù)來設(shè)置跳過行,從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會默認(rèn)將NA、-1.#IND、NULL等當(dāng)作是缺失值,pandas默認(rèn)使用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默認(rèn)被當(dāng)作的缺失值還不能滿足你的要求,我們可以通過設(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 '''
也許有時候你還會遇到,你想將某個值替換成為NaN,但是可能有多個列都包含了這個值,而我們卻不想替換所有的列,我們可以通過一個字典的形式來設(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進行替代,將所有的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的參數(shù)介紹
read_csv和read_table函數(shù)有很多的參數(shù),下面對一些重點參數(shù)進行介紹。
參數(shù):
path:表示文件系統(tǒng)位置、URL、文件型對象的字符串。
sep或delimiter:用于對行中各字段進行拆分的字符序列或正則表達式。
header:用作列名的行號。默認(rèn)為0(第一行),如果文件沒有標(biāo)題行就將header參數(shù)設(shè)置為None。
index_col:用作行索引的列編號或列名??梢允菃蝹€名稱/數(shù)字或有多個名稱/數(shù)字組成的列表(層次化索引)。
names:用于結(jié)果的列名列表,結(jié)合header=None,可以通過names來設(shè)置標(biāo)題行。
skiprows:需要忽略的行數(shù)(從0開始),設(shè)置的行數(shù)將不會進行讀取。
na_values:設(shè)置需要將值替換成NA的值。
comment:用于注釋信息從行尾拆分出去的字符(一個或多個)。
parse_dates:嘗試將數(shù)據(jù)解析為日期,默認(rèn)為False。如果為True,則嘗試解析所有列。除此之外,參數(shù)可以指定需要解析的一組列號或列名。如果列表的元素為列表或元組,就會將多個列組合到一起再進行日期解析工作。
keep_date_col:如果連接多列解析日期,則保持參與連接的列。默認(rèn)為False。
converters:由列號/列名跟函數(shù)之間的映射關(guān)系組成的字典。如,{"age:",f}會對列索引為age列的所有值應(yīng)用函數(shù)f。
dayfirst:當(dāng)解析有歧義的日期時,將其看做國際格式(例如,7/6/2012 ---> June 7 , 2012)。默認(rèn)為False。
date_parser:用于解析日期的函數(shù)。
nrows:需要讀取的行數(shù)。
iterator:返回一個TextParser以便逐塊讀取文件。
chunksize:文件塊的大?。ㄓ糜诘?。
skip_footer:需要忽略的行數(shù)(從文件末尾開始計算)。
verbose:打印各種解析器輸出信息,如“非數(shù)值列中的缺失值的數(shù)量”等。
encoding:用于unicode的文本編碼格式。例如,"utf-8"或"gbk"等文本的編碼格式。
squeeze:如果數(shù)據(jù)經(jīng)過解析之后只有一列的時候,返回Series。
thousands:千分位分隔符,如","或"."。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Python實現(xiàn)的求解最大公約數(shù)算法示例
這篇文章主要介紹了Python實現(xiàn)的求解最大公約數(shù)算法,涉及Python數(shù)學(xué)運算相關(guān)操作技巧,需要的朋友可以參考下2018-05-05一文帶你掌握Python中enumerate函數(shù)和for循環(huán)的對比
在Python編程中,循環(huán)是一項常見的任務(wù),而for循環(huán)是最常見的一種,然而,Python提供了enumerate函數(shù),它允許在迭代過程中訪問元素的同時獲得它們的索引,下面我們就來學(xué)習(xí)一下二者的區(qū)別吧2023-11-11python 最簡單的實現(xiàn)適配器設(shè)計模式的示例
這篇文章主要介紹了python 最簡單的實現(xiàn)適配器設(shè)計模式的示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06使用pandas模塊實現(xiàn)數(shù)據(jù)的標(biāo)準(zhǔn)化操作
這篇文章主要介紹了使用pandas模塊實現(xiàn)數(shù)據(jù)的標(biāo)準(zhǔn)化操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-05-05