Python數(shù)據(jù)科學(xué)入門
Dmitry Zinoviev著
熊子源 譯
第6章 使用Series和frame
Pandas模塊的初中時(shí)為了給Python添加Series和frame兩個(gè)抽象的數(shù)據(jù)結(jié)構(gòu),它們其實(shí)是Python的競(jìng)爭(zhēng)對(duì)手、最早的數(shù)據(jù)科學(xué)語(yǔ)言——R語(yǔ)言的核心。
Pandas的frame本質(zhì)是一個(gè)“智能”電子表格:具有標(biāo)簽、列(變量)、行(觀測(cè)記錄),以及大量?jī)?nèi)置操作的表。(Series是一個(gè)只有一列的frame)表的數(shù)據(jù)部分(單元格)以numpy數(shù)組的方式實(shí)現(xiàn)。
第31單元 pandas數(shù)據(jù)結(jié)構(gòu)
Series
Series是一維的數(shù)據(jù)矢量。是同構(gòu)的:Series中左右數(shù)據(jù)項(xiàng)必須是相同的數(shù)據(jù)類型。
Series中的函數(shù):
- head() 返回Series中前五行數(shù)據(jù)(默認(rèn)5行)
- tail() 返回Series中后五行數(shù)據(jù)(默認(rèn)5行)
Frame
Frame是一個(gè)行和列都具有標(biāo)簽的表。可以通過二維numpy數(shù)組、元組列表、Python字典或一個(gè)frame構(gòu)造出一個(gè)新的frame。
第32單元 數(shù)據(jù)重塑
索引:
Frame的索引是一組分配給frame行的標(biāo)簽集合。
| reset_index() | 刪除現(xiàn)有索引 |
|---|---|
| set_index() | 建立一個(gè)新索引 |
| drop() | 返回一個(gè)刪除了一行或若干行的frame的副本。 |
重建索引:
從現(xiàn)有的frame或series中選擇一定的行排列、列排列或者行和列排列,來創(chuàng)建新的frame或Series。
分層索引:
也稱為多級(jí)索引或多重索引。由以下三個(gè)列表組成:
- 級(jí)別名稱
- 每個(gè)級(jí)別可能存在的所有標(biāo)簽
- Frame或Series中每一項(xiàng)的實(shí)際值的列表。
MultiIndex.from_tuples() 使用帶有標(biāo)簽的元組和可選的級(jí)別名稱列表生成多級(jí)索引。
堆疊和旋轉(zhuǎn):
使用多級(jí)的列名可以將多級(jí)索引完全或部分扁平化,相反,使用多級(jí)索引也可以將多級(jí)的列名完全或部分扁平化。
| stack() | 增加索引的級(jí)別數(shù),同時(shí)減少列名的級(jí)別數(shù)。 |
|---|---|
| unstack() | 增加列名的級(jí)別數(shù),同時(shí)減少索引的級(jí)別數(shù)。 |
| pivot(index,columns,values) | 將frame轉(zhuǎn)換為另一個(gè)frame,新的frame使用列索引作為新的索引,columns作為新的列名列表,values作為數(shù)據(jù)。 |
第33單元 處理缺失數(shù)據(jù)
Pandas沿用了傳統(tǒng)的numpy.nan(第5章-第25單元)來表示缺失數(shù)據(jù)。Pandas還提供了識(shí)別和插補(bǔ)缺失值的函數(shù)。
缺失值必須被刪除或者插補(bǔ)(將其替換成有意義的值)。
刪除缺失值:
dropna()函數(shù)
可以刪除部分(how=”any”,默認(rèn))或全部(how=”all”)無效的列(axis=0,默認(rèn))或行(axis=1),并返回“干凈的”frame對(duì)象。
插補(bǔ)缺失數(shù)據(jù):
兩種常見的插補(bǔ)技術(shù)是使用常數(shù)(0,1)和“干凈”值得平均數(shù)替換缺失值。
isnull()和notnull()
是互補(bǔ)的。當(dāng)某個(gè)值是nan時(shí),isnull()返回True;當(dāng)某個(gè)值不是nan時(shí),notnull()返回True。
根據(jù)IEEE 754的浮點(diǎn)數(shù)標(biāo)準(zhǔn),表達(dá)式
np.nan==np.nan為False
,這使得直接比較是不可能的!
替換數(shù)據(jù):
replace(val_or_list,new_val)函數(shù)
將一個(gè)值或值列表替換成一個(gè)新的值或值列表,列表的長(zhǎng)度必須一樣。除非傳遞inplace=True參數(shù)(表示在原始表中修改),負(fù)責(zé)該函數(shù)會(huì)返回一個(gè)新的frame或series。
第34單元 組合數(shù)據(jù)
合并:
如果兩個(gè)frame具有一個(gè)相同的列,就可以將該列上的frame合并。即使沒有相同名稱的列,也可以指定其他列作為鍵。
df = pd.merge(df1,df2,on=”key”)
df = pd.merge(df1,df2,left_on=”key1”,right_on=”key2”)
如果要在索引列而不是一般的列上合并,使用可選參數(shù)left_index=True和right_index=True實(shí)現(xiàn)。
join()和merge() 這兩個(gè)函數(shù)使用同一個(gè)可選參數(shù)how,它的可接受參數(shù)為“l(fā)eft”(join()的默認(rèn)值),“right”,“inner”,“outer”(merge()的默認(rèn)值)
連接:
Concat()函數(shù)
通過一組frame彼此“豎直”(axis=0,默認(rèn)值)或“水平”(axis=1)放置在一起來連接它們,并返回一個(gè)新的frame。
Pd.concat([alco2009,population],axis=0).tail()
如果frame的維度不匹配,pandas就會(huì)在所謂的“空位”處加入具有缺失值的行或列。
刪除重復(fù)行:
duplicated([subset],keep=””)
返回一個(gè)布爾型的Series,表示在所有列或subset(是一個(gè)列名稱組成的序列)表示的列中是否有重復(fù)的行。Keep表示控制標(biāo)記的重復(fù)行是第一個(gè)重復(fù)行(“first”)、最后一個(gè)重復(fù)行(“l(fā)ast”)、每個(gè)重復(fù)行(“True”)都標(biāo)記。
drop_duplicates([subset],keep=””,Inpalce=True)
返回一個(gè)刪除了所有列或subset(是一個(gè)列名稱組成的序列)表示的列中重復(fù)行的frame或Series。Keep表示控制刪除的行是第一個(gè)重復(fù)行(“first”)、最后一個(gè)重復(fù)行(“l(fā)ast”)、每個(gè)重復(fù)行(“True”)都刪除。Inpalce=True可以從原始對(duì)象中刪除重復(fù)項(xiàng)。
第35單元 數(shù)據(jù)的排序和描述
排序和分級(jí):
sort_index()返回按照索引排序的frame。相關(guān)參數(shù)說明如下:
| ascending | (默認(rèn)值為True(升序))來控制升序或降序; |
|---|---|
| na_position | (取值為“first”或”last“)指定值為nan的單元在排序后的位置, |
| numeric_only | 僅將等級(jí)限制為數(shù)值 |
| na_option | (取值為“top”,”bottom”或“keep”)設(shè)定nan的處理方式:將它們轉(zhuǎn)移到新frame的頂部、底部或保留原始位置。 |
描述性統(tǒng)計(jì)量:
| argmax() | 找出最大值首次出現(xiàn)的索引位置(針對(duì)series) |
|---|---|
| idxmax() | 找出最大值首次出現(xiàn)的索引位置(針對(duì)frame) |
| cumsum() | 累積和 |
| cumprod() | 累計(jì)乘積 |
| cummin() | 累積最小值 |
| cummax() | 累積最大值 |
| diff() | 計(jì)算連續(xù)的列或Series項(xiàng)之間的滑動(dòng)值 |
唯一性、計(jì)數(shù)、會(huì)員資格:
| unique() | 計(jì)算不同值的組成的數(shù)組,并能給出每個(gè)不同值出現(xiàn)的次數(shù)。用在Series中 |
|---|---|
| value_counts() | 計(jì)算不同值的組成的數(shù)組,并能給出每個(gè)不同值出現(xiàn)的次數(shù)。用在frame中 |
| isin() | 專門為Series和frame定義的。它返回一個(gè)與數(shù)據(jù)大小相同的布爾型的Series或frame,用于確定Series或frame的每一項(xiàng)是否存在于某個(gè)集合中。 |
第36單元 數(shù)據(jù)轉(zhuǎn)換
數(shù)據(jù)聚合:
groupby()
通過一個(gè)或多個(gè)分類的鍵值將行分到不同的組中,從而實(shí)現(xiàn)對(duì)frame的分割。
聚合函數(shù)包括以下幾種:
| count() | 返回組中的行數(shù) |
|---|---|
| sum() | 返回組中數(shù)字行的總和 |
| mean() | 返回組中所有行相應(yīng)的統(tǒng)計(jì)量度量 |
| median() | 返回組中所有行相應(yīng)的統(tǒng)計(jì)量度量 |
| std() | 返回組中所有行相應(yīng)的統(tǒng)計(jì)量度量 |
| var() | 返回組中所有行相應(yīng)的統(tǒng)計(jì)量度量(沒錯(cuò),這四個(gè)函數(shù)效果一模一樣) |
| min() | 返回組中最小的行 |
| max() | 返回組中最大的行 |
| prod() | 返回組中數(shù)字行的乘積 |
| first() | 返回組中的第一行(用在frame中) |
| last() | 返回組中的最后一行(用在frame中) |
離散化:
離散化是指將連續(xù)變量轉(zhuǎn)化為離散(分類)變量,通常用于直方圖和機(jī)器學(xué)習(xí)。
qcuts()
與cuts()類似,不同的是qucts()使用分位數(shù)而不是區(qū)間寬度進(jìn)行分割。可以用它來計(jì)算分位數(shù)。
qet_dummies()
將數(shù)組、series或frame轉(zhuǎn)換為與原始對(duì)象擁有相同索引的另一個(gè)frame,每個(gè)列對(duì)應(yīng)一個(gè)虛擬變量。
映射:
map() 將任意的單參數(shù)函數(shù)應(yīng)用于選中列中的每一個(gè)元素。(非常低效)
第37單元 掌握pandas的文件讀寫功能
Pandas支持:
- 自動(dòng)索引和列名提取
- 數(shù)據(jù)類型推斷、數(shù)據(jù)轉(zhuǎn)換和缺失值的檢測(cè)
- 日期時(shí)間解析
- 消除“不干凈”的數(shù)據(jù)
- 數(shù)據(jù)分塊
讀取CSV和表格文件:
read_csv()
根據(jù)文件名或打開的文件句柄,從指定的CSV文件中讀取一個(gè)frame。該函數(shù)具有近50個(gè)可選參數(shù)。
read_csv()函數(shù)中重要參數(shù)說明:
| sep/delimiter | 列分隔符,可以接受正則表達(dá)式 |
|---|---|
| header | 作為列名的行號(hào)(如果有自己的行號(hào),則傳遞None) |
| index_col | 作為索引的列名(False表示默認(rèn)數(shù)字索引) |
| skiprows | 要跳過的文件頭行號(hào)或行號(hào)列表 |
| thousands | 表示大數(shù)時(shí)使用的千位分隔符 |
| names | 列名列表 |
| na_values | 用于處理缺失數(shù)據(jù)的字符串或字符串列表 |
(
"What you get is what you get.What you do with what you get, that's more the point."--《City of Ember 》
)
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元

