Python利用pandas處理CSV文件的用法示例
一、pandas簡(jiǎn)介
pandas是一個(gè)第三方數(shù)據(jù)分析庫,其集成了大量的數(shù)據(jù)分析工具,可以方便的處理和分析各類數(shù)據(jù)。這是一個(gè)第三方庫,使用下面的命令可以安裝pandas:
pip install pandas
利用pandas處理CSV文件主要分為3步:
- 通過read_csv()函數(shù),將數(shù)據(jù)轉(zhuǎn)化為pandas的DataFrame(數(shù)據(jù)幀)對(duì)象,這是一個(gè)二維數(shù)據(jù)對(duì)象,集成了大量數(shù)據(jù)處理方法。
- 操作DataFrame對(duì)象,通過自帶的方法,完成各種數(shù)據(jù)處理。
- 通過DataFrame對(duì)象的to_csv()方法將數(shù)據(jù)寫回CSV文件。
二、用法示例
我們先創(chuàng)建一個(gè)示例文件,將下面的數(shù)據(jù)拷貝到文件employees.csv中并保存:
emp_no,birth_date,first_name,last_name,gender,salary 1,1953-09-02,Georgi,Facello,M,1000 2,1964-06-02,Bezalel,Simmel,F,2000 3,1959-12-03,Parto,Bamford,M,3000 4,1954-05-01,Chirstian,Koblick,M,4000 5,1955-01-21,Kyoichi,Maliniak,M,5000 6,1953-04-20,Anneke,Preusig,F,6000 7,1957-05-23,Tzvetan,Zielinski,F,7000 8,1958-02-19,Saniya,Kalloufi,M,8000 9,1952-04-19,Sumant,Peac,F,9000
數(shù)據(jù)對(duì)應(yīng)的excel格式,作為參考:
2.1 讀取CSV文件
保證employees.csv文件在當(dāng)前目錄下(或提供文件的絕對(duì)路徑也可以),例如示例文件保存在d:\dir1目錄下,先切換到該目錄下:
import os os.chdir(r'd:\dir1')
pandas的read_csv函數(shù)可以讀取CSV文件,并返回一個(gè)DataFrame對(duì)象,首次使用要先導(dǎo)入pandas模塊,使用read_csv()函數(shù)讀取csv文件,并將返回的DataFrame對(duì)象賦給變量名df:
import pandas as pd df = pd.read_csv('employees.csv') df
2.1.1 read_csv參數(shù)
read_csv()在讀取過程中有很多自定義設(shè)置,上面的示例中只提供了文件名,其他參數(shù)都采用了默認(rèn)值。根據(jù)數(shù)據(jù)格式的不同,可能需要對(duì)某些參數(shù)進(jìn)行調(diào)整,read_csv函數(shù)的常用參數(shù)如下:
- sep/delimiter:分隔符,默認(rèn)為逗號(hào),相當(dāng)于sep=‘,’,如果文件內(nèi)容以非逗號(hào)分隔,需要顯式指定此參數(shù)或者使用sep=None來讓pandas自己判斷分隔符。
- delim_whitespace:是否以空格作為分隔符,相當(dāng)于sep=‘\s+’,當(dāng)這個(gè)參數(shù)被設(shè)置為True時(shí),不能使用sep參數(shù)。
- header:指定第幾行作為列名,并指定數(shù)據(jù)的起始行,默認(rèn)header=0,表示第1行作為列名(編號(hào)從0開始),數(shù)據(jù)從第二行開始。如果數(shù)據(jù)中沒有列名,需要指定header=None,這樣從第1行開始全部都會(huì)當(dāng)成數(shù)據(jù)。
- names:用來自定義列名
- index_col:指定某一列作為行索引(默認(rèn)是0開始的整數(shù))
- usecols:選擇列的子集,即只讀取指定列
示例:僅選取部分列,只讀取emp_no,first_name, salary 這3列,使用參數(shù)usecols指定這3列:
df1 = pd.read_csv('employees.csv', usecols=['emp_no', 'first_name', 'salary'])
自定義列名:讀取數(shù)據(jù)并使用col1~col6定義列名,由于原數(shù)據(jù)第一行為列名,使用header=0指定第一行為列名,這樣第一行不會(huì)被讀作數(shù)據(jù)。然后使用names參數(shù)重新指定列名:
name_list = ['col1', 'col2', 'col3','col4','col5','col6'] df2 = pd.read_csv('employees.csv', header=0, names=name_list)
2.1.2 "壞行"的處理
很多時(shí)候我們得到數(shù)據(jù)格式并不規(guī)范,可能出現(xiàn)有些行數(shù)據(jù)缺失,有些行數(shù)據(jù)又多。read_csv函數(shù)在遇到數(shù)據(jù)缺失的列會(huì)自動(dòng)用NaN(在pandas中代表空值)來填充(我們把文件中第七行的salary刪除,重新讀取后,可以看到會(huì)用自動(dòng)用NaN填充):
df2 = pd.read_csv('employees.csv')
但是對(duì)于數(shù)據(jù)列多的行,默認(rèn)是報(bào)錯(cuò)的。在文件第8行后多加一列數(shù)據(jù),提示解析錯(cuò)誤,期望6列,但是有7列:
df3 = pd.read_csv('employees.csv')
對(duì)于這類錯(cuò)誤,我們可以用on_bad_lines='skip’來跳過這些行,不影響其他數(shù)據(jù)的讀取,從結(jié)果也上可以看到emp_no為8的數(shù)據(jù)被忽略了:
df3 = pd.read_csv('employees.csv', on_bad_lines='skip')
2.2 引用數(shù)據(jù)
在完成文件的讀取后我們就獲得了一個(gè)DataFrame對(duì)象,利用其自帶的方法可以快速進(jìn)行數(shù)據(jù)預(yù)處理,相對(duì)于使用Python代碼,可以節(jié)約大量邏輯編寫的時(shí)間。
對(duì)數(shù)據(jù)進(jìn)行處理的第一步就是引用數(shù)據(jù),pandas常用的數(shù)據(jù)引用方法有:
- 使用[]對(duì)數(shù)據(jù)進(jìn)行引用
- 使用.loc屬性通過標(biāo)簽對(duì)數(shù)據(jù)進(jìn)行引用
- 使用.iloc屬性通過位置對(duì)數(shù)據(jù)進(jìn)行引用
2.2.1 位置索引和標(biāo)簽索引
在引用數(shù)據(jù)前先弄清楚位置索引和標(biāo)簽索引:
- 位置索引:行/列的位置編號(hào),從0開始,公差為1的等差數(shù)列,0,1,2,3,4….,一定是數(shù)字
- 標(biāo)簽索引:行/列的"別名",可以自定義。其中行的標(biāo)簽索引又叫"索引標(biāo)簽",列的標(biāo)簽索引又叫"列標(biāo)簽"。
標(biāo)簽索引如果未顯式指定,則默認(rèn)和位置索引相同。
例如下面的df,紅框中的都是標(biāo)簽索引:
列標(biāo)簽是emp_no, birth_date ……,索引標(biāo)簽由于未顯式指定,所以和位置索引相同,為0,1,2,3,4….,但它不是位置索引。
在標(biāo)簽索引中,可以通過df.index和df.columns屬性來分別查看索引標(biāo)簽和列標(biāo)簽:
df.index df.columns
通過給對(duì)應(yīng)的屬性賦值,可以改變標(biāo)簽,通過下面的例子可以直觀看到,紅框中的0,1,2,3…是索引標(biāo)簽,而不是位置標(biāo)簽:
df.index = [0,1,2,3,'a','b','c','d','e']
2.2.2 使用[]引用數(shù)據(jù)
使用df[‘列標(biāo)簽’]的格式,通過列標(biāo)簽可以引用數(shù)據(jù)列,例如選擇frist_name列:
df['first_name']
如果要引用多個(gè)列,以列表的形式傳入多個(gè)列,例如選擇emp_no, first_name, last_name這3列:
df[['emp_no', 'first_name', 'last_name']]
使用df[start:stop:step]的格式,可以通過位置索引引用行,這和標(biāo)準(zhǔn)的Python切片語法相同(這里不詳細(xì)介紹):
df[0:4] # 注意[0:4]含頭不含尾,即位置索引為0,1,2,3的行
df[::2] # 每隔一行選擇,start和stop省略代表全部,2代表步長
df[::-1] # 負(fù)的步長代表從結(jié)尾開始選擇,-1即相當(dāng)于倒序
2.2.3 使用.loc屬性通過標(biāo)簽引用數(shù)據(jù)
使用[]的引用方式可能有些復(fù)雜,它在引用列的時(shí)候用的是標(biāo)簽索引,而在引用行的時(shí)候是位置索引。
pandas提供了更直觀的.loc和.iloc屬性:
- .loc專門使用標(biāo)簽索引來引用數(shù)據(jù)(分片含結(jié)尾)
- .iloc專門使用位置索引來引用數(shù)據(jù)(分片不含結(jié)尾)
使用df.loc[‘索引標(biāo)簽’, ‘列標(biāo)簽’]可以引用數(shù)據(jù)。標(biāo)簽之間用逗號(hào)分隔,標(biāo)簽內(nèi)部的分片用冒號(hào)分隔,省略則代表全部。注意,.loc屬性中的分片是包含結(jié)尾的,這和標(biāo)準(zhǔn)的python分片語法不同。
引用a行(返回的是pandas一維數(shù)據(jù)類型Series):
df.loc['a'] # 列標(biāo)簽省略,代表所有列,相當(dāng)于df.loc['a',:]
引用birth_date列:
df.loc[:,'birth_date'] # 行標(biāo)簽省略,代表所有行,用:占位
引用a-e行,及emp_no到last_name列,注意e行和last_name列都是包含在分片結(jié)果中的:
df.loc['a':'e', 'emp_no':'last_name']
引用a行,birth_date列的單一元素(沒有分片):
df.loc['a', 'birth_date']
2.2.4 使用.iloc屬性通過位置引用數(shù)據(jù)
.iloc的使用方式和.loc很像,只是將索引標(biāo)簽換成了位置標(biāo)簽。語法為df.iloc[‘行位置索引’, ‘列位置索引’],注意.iloc的分片是不包含結(jié)尾的(和python相同)。
引用第1,2行:
df.iloc[0:2] # 引用行位置索引為0,1的行,2是不包含在結(jié)果中的,相當(dāng)于df.iloc[0:2, :]
引用第1,2列:
df.iloc[:,0:2] # 行位置索引的:表示全部行
引用1,2行的3,4列數(shù)據(jù):
df.iloc[0:2, 2:4]
數(shù)據(jù)引用配合賦值符號(hào)’=',即可以修改DataFrame中的值,例如將emp_no為9的salary改為9999
df.loc['e', 'salary'] = 9999
其他的數(shù)據(jù)引用方式還有通過屬性進(jìn)行引用,但這種方式存在缺陷,不推薦,這里也不進(jìn)行介紹。重點(diǎn)掌握.loc和.iloc的方法即可。
2.3 數(shù)據(jù)過濾
DataFrame的數(shù)據(jù)過濾非常方便,例如我要選擇salary大于5000的數(shù)據(jù),下面表達(dá)式即是salary列測(cè)試結(jié)果,由bool型數(shù)據(jù)組成:
df['salary']>5000
只需要將其再代入df,即可篩選出滿足條件的數(shù)據(jù):
df[ df['salary']>5000 ]
或者使用query方法,基于字符串形式的條件,直接過濾出結(jié)果:
df.query('salary>5000')
2.4 寫回csv文件
完成數(shù)據(jù)處理后,使用DataFrame對(duì)象自帶的to_csv方法來將數(shù)據(jù)寫回文件,主要參數(shù)與read_csv類似:
- sep:分隔符,默認(rèn)是逗號(hào)。
- columns:指定哪些列寫入文件
- header:是否將標(biāo)題寫入文件,默認(rèn)是True
- index:是否將行索引寫入文件,默認(rèn)是True
假設(shè)要將salary>5000的數(shù)據(jù)篩選出來后,重新寫入一個(gè)CSV文件,你可以直接調(diào)用DataFrame的to_csv方法:
df_result = df.query('salary>5000') df_result.to_csv('result.csv', index=False)
本文的案例只是展示了最簡(jiǎn)單及最常用的DataFrame數(shù)據(jù)處理方法,實(shí)際pandas的數(shù)據(jù)處理功能遠(yuǎn)遠(yuǎn)不止這些,有興趣的同學(xué)可以自行深入探索。
以上就是Python利用pandas處理CSV文件的用法示例的詳細(xì)內(nèi)容,更多關(guān)于Python pandas處理CSV的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
python之實(shí)現(xiàn)兩個(gè)或多個(gè)列表相加
這篇文章主要介紹了python之實(shí)現(xiàn)兩個(gè)或多個(gè)列表相加方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-08-08python 讀取視頻,處理后,實(shí)時(shí)計(jì)算幀數(shù)fps的方法
今天小編就為大家分享一篇python 讀取視頻,處理后,實(shí)時(shí)計(jì)算幀數(shù)fps的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-07-07django頁面跳轉(zhuǎn)問題及注意事項(xiàng)
這篇文章主要介紹了django頁面跳轉(zhuǎn)問題及注意事項(xiàng),本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-07-07python深度學(xué)習(xí)tensorflow1.0參數(shù)和特征提取
這篇文章主要為大家介紹了python深度學(xué)習(xí)tensorflow1.0參數(shù)和特征提取,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06Python爬蟲教程之利用正則表達(dá)式匹配網(wǎng)頁內(nèi)容
這篇文章主要給大家介紹了關(guān)于Python爬蟲教程之利用正則表達(dá)式匹配網(wǎng)頁內(nèi)容的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12Python+OpenCV圖像處理—— 色彩空間轉(zhuǎn)換
這篇文章主要介紹了Python+OpenCV如何對(duì)圖片進(jìn)行色彩空間轉(zhuǎn)換,幫助大家更好的利用python處理圖片,感興趣的朋友可以了解下下2020-10-10Python基于gevent實(shí)現(xiàn)高并發(fā)代碼實(shí)例
這篇文章主要介紹了Python基于gevent實(shí)現(xiàn)高并發(fā)代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-05-05