第三節(jié) Pandas入門基礎(chǔ)

本章節(jié)以及后續(xù)章節(jié)的源碼,當(dāng)然也可以從我的github下載,在源碼中我自己加了一些中文注釋。

現(xiàn)在是晚上九點(diǎn)十五,哎,今天要寫的東西有點(diǎn)多,看來又得推到明天了。不該刷抖音看微博,emmmmmm..........

進(jìn)入正題:

Pandas含有使數(shù)據(jù)清洗和分析工作變得更快更簡(jiǎn)單的數(shù)據(jù)結(jié)構(gòu)和操作工具。pandas經(jīng)常和其它工具一同使用,如數(shù)值計(jì)算工具NumPy和SciPy,分析庫(kù)statsmodels和scikit-learn,和數(shù)據(jù)可視化庫(kù)matplotlib。pandas是基于NumPy數(shù)組構(gòu)建的,特別是基于數(shù)組的函數(shù)和不使用for循環(huán)的數(shù)據(jù)處理。

雖然pandas采用了大量的NumPy編碼風(fēng)格,但二者最大的不同是pandas是專門為處理表格和混雜數(shù)據(jù)設(shè)計(jì)的。而NumPy更適合處理統(tǒng)一的數(shù)值數(shù)組數(shù)據(jù)。

使用pandas首先要了解它的兩個(gè)數(shù)據(jù)結(jié)構(gòu):Series和DataFrame

一、Series

Series是一種類似于一維數(shù)組的對(duì)象,它由一組數(shù)據(jù)以及一組與之相關(guān)的數(shù)據(jù)標(biāo)簽(即索引)組成。

二、DataFrame

DataFrame是一個(gè)表格型的數(shù)據(jù)結(jié)構(gòu),它含有一組有序的列,每列可以是不同的值類(數(shù)值、字符串、布爾值等)

可以輸入給DataFrame構(gòu)造器的數(shù)據(jù):

構(gòu)建DataFrame

三、索引對(duì)象

pandas的索引對(duì)象負(fù)責(zé)管理軸標(biāo)簽和其他元數(shù)據(jù)(比如軸名稱等)。構(gòu)建Series和DataFrame時(shí),所用的任何數(shù)組或其他序列標(biāo)簽都會(huì)被轉(zhuǎn)換成一個(gè)Index

與python的集合不同,pandas的Index可以包含重復(fù)的標(biāo)簽

每個(gè)索引都有一些方法和屬性,它們可用于設(shè)置邏輯并回答有關(guān)該索引所包含的數(shù)據(jù)的常見問題。表5-2列出了這些函數(shù)。

四、Pandas基本功能

1、重新索引(reindex函數(shù))

reindex函數(shù)的參數(shù):

插值(method)的選項(xiàng):

2、丟棄指定軸上的項(xiàng)

丟棄某條軸上的一個(gè)或多個(gè)項(xiàng)很簡(jiǎn)單,只要有一個(gè)索引數(shù)組或列表即可。drop方法返回的是一個(gè)在指定軸上刪除了指定值的新對(duì)象。

用標(biāo)簽序列調(diào)用drop會(huì)從行標(biāo)簽(axis 0)刪除值
通過傳遞axis=1或axis='columns'可以刪除列的值

3、索引、選取和過濾

利用標(biāo)簽的切片運(yùn)算與普通的Python切片運(yùn)算不同,其末端是包含的

通過布爾型DataFrame進(jìn)行索引??

(1)? loc和iloc的區(qū)別

iloc主要使用數(shù)字來索引數(shù)據(jù),而不能使用字符型的標(biāo)簽來索引數(shù)據(jù)。而loc則剛好相反,只能使用字符型標(biāo)簽來索引數(shù)據(jù),不能使用數(shù)字來索引數(shù)據(jù),不過有特殊情況,當(dāng)數(shù)據(jù)框dataframe的行標(biāo)簽或者列標(biāo)簽為數(shù)字,loc就可以來其來索引。

(2)ix是一種混合索引,字符型標(biāo)簽和整型數(shù)據(jù)索引都可以。在pandas0.20.0及以上版本,ix已經(jīng)丟棄,請(qǐng)盡量使用loc和iloc;

所以,在pandas中,有多個(gè)方法可以選取和重新組合數(shù)據(jù),對(duì)于DataFrame,表5-4進(jìn)行了總結(jié)。

4、整數(shù)索引

處理整數(shù)索引的pandas對(duì)象常常難住新手,因?yàn)樗cPython內(nèi)置的列表和元組的索引語法不同。例如,你可能不認(rèn)為下面的代碼會(huì)出錯(cuò):

ser = pd.Series(np.arange(3.))

ser

ser[-1]

這里,pandas可以勉強(qiáng)進(jìn)行整數(shù)索引,但是會(huì)導(dǎo)致小bug。我們有包含0,1,2的索引,但是引入用戶想要的東西(基于標(biāo)簽或位置的索引)很難,另外,對(duì)于非整數(shù)索引,就不會(huì)產(chǎn)生歧義

為了進(jìn)行統(tǒng)一,如果軸索引含有整數(shù),數(shù)據(jù)選取總會(huì)使用標(biāo)簽。為了更準(zhǔn)確,請(qǐng)使用loc(標(biāo)簽)或iloc(整數(shù))

5、算術(shù)運(yùn)算和數(shù)據(jù)對(duì)齊

pandas最重要的一個(gè)功能是,它可以對(duì)不同索引的對(duì)象進(jìn)行算術(shù)運(yùn)算。在將對(duì)象相加時(shí),如果存在不同的索引對(duì),則結(jié)果的索引就是該索引對(duì)的并集。對(duì)于有數(shù)據(jù)庫(kù)經(jīng)驗(yàn)的用戶,這就像在索引標(biāo)簽上進(jìn)行自動(dòng)外連接。

自動(dòng)的數(shù)據(jù)對(duì)齊操作在不重疊的索引處引入了NA值。缺失值會(huì)在算術(shù)運(yùn)算過程中傳播

對(duì)于DataFrame,對(duì)齊操作會(huì)同時(shí)發(fā)生在行和列上:

把它們相加后將會(huì)返回一個(gè)新的DataFrame,其索引和列為原來那兩個(gè)DataFrame的并集:


表下列出了Series和DataFrame的算術(shù)方法。它們每個(gè)都有一個(gè)副本,以字母r開頭,它會(huì)翻轉(zhuǎn)參數(shù)。因此這兩個(gè)語句是等價(jià)的:

靈活的算術(shù)方法:

DataFrame和Series之間的運(yùn)算:

當(dāng)我們從arr減去arr[0],每一行都會(huì)執(zhí)行這個(gè)操作,這就叫做廣播(broadcasting)

默認(rèn)情況下,DataFrame和Series之間的算術(shù)運(yùn)算會(huì)將Series的索引匹配到DataFrame的列,然后沿著行一直向下廣播:

如果某個(gè)索引值在DataFrame的列或Series的索引中找不到,則參與運(yùn)算的兩個(gè)對(duì)象就會(huì)被重新索引以形成并集:

如果你希望匹配行且在列上廣播,則必須使用算術(shù)運(yùn)算方法。例如:

6、函數(shù)應(yīng)用和映射

另一個(gè)常見的操作是將函數(shù)應(yīng)用到由各列或行所形成的一維數(shù)組上,DataFrame 的apply方法即可實(shí)現(xiàn)該功能


這里的函數(shù)f,計(jì)算了一個(gè)Series的最大值和最小值的差,在frame的每列都執(zhí)行了一次。結(jié)果是一個(gè)Series,使用frame的列作為索引。

7、排序和排名

要對(duì)行或列索引進(jìn)行排序,可使用sort_index方法,它將返回一個(gè)已排序的新對(duì)象

在排序時(shí),任何缺失值默認(rèn)都會(huì)被放到Series的末尾

排名用rank()函數(shù),rank是通過“為各組分配一個(gè)平均排名”的方式破壞平級(jí)關(guān)系的:

條目0和2沒有使用平均排名6.5,它們被設(shè)成了6和7,因?yàn)閿?shù)據(jù)中標(biāo)簽0位于標(biāo)簽2的前面。

排名時(shí)用于破壞平級(jí)關(guān)系的method選項(xiàng):

8、帶有重復(fù)值的軸索引

8、匯總和計(jì)算描述統(tǒng)計(jì)

pandas對(duì)象擁有一組常用的數(shù)學(xué)和統(tǒng)計(jì)方法。它們大部分都屬于越簡(jiǎn)和匯總統(tǒng)計(jì),用于從Series中提取單個(gè)值(如sum和mean)或從DataFrame的行或列中提取一個(gè)Series。

約簡(jiǎn)方法的選項(xiàng):

描述和匯總統(tǒng)計(jì)方法:

10、相關(guān)系數(shù)和協(xié)方差

相關(guān)系數(shù)和協(xié)方差是通過參數(shù)對(duì)計(jì)算出來的。我們選取來自Yahoo!Finance的股票價(jià)格和成交量:

在看代碼前先干兩件事:

一、pip install pandas_datareader安裝這個(gè)模塊,然后把這個(gè)模塊下(\Lib\site-packages\pandas_datareader)下的fred.py文件中的pandas.core.common import is_list_like修改為pandas.api.types import is_list_like

二、pip install fix_yahoo_finance安裝這個(gè)模塊,在獲取數(shù)據(jù)前運(yùn)行以下代碼即可:

import fix_yahoo_finance as fy

fy.pdr_override()

AAPL的數(shù)據(jù)

11、唯一值、值計(jì)數(shù)以及成員資格

唯一值、值計(jì)數(shù)、成員資格方法:

結(jié)果中的行標(biāo)簽是所有列的唯一值。后面的頻率值是每個(gè)列中這些值的相應(yīng)計(jì)數(shù)。

五、層次化索引

層次化索引是pandas的一項(xiàng)重要功能,它使你能在一個(gè)軸上擁有多個(gè)(兩個(gè)以上)索引級(jí)別。

重新調(diào)整某條軸上各級(jí)別的順序,或根據(jù)指定級(jí)別上的值對(duì)數(shù)據(jù)進(jìn)行排序。swaplevel接受兩個(gè)級(jí)別編號(hào)或名稱,并返回一個(gè)互換了級(jí)別的新對(duì)象(但數(shù)據(jù)不會(huì)發(fā)生變化):

sort_index則根據(jù)單個(gè)級(jí)別中的值對(duì)數(shù)據(jù)進(jìn)行排序。交換級(jí)別時(shí),常常也會(huì)用到sort_index,這樣最終結(jié)果就是按照指定順序進(jìn)行字母排序了:

許多對(duì)DataFrame和Series的描述和匯總統(tǒng)計(jì)都有一個(gè)level選項(xiàng),它用于指定在某條軸上求和的級(jí)別。再以上面那個(gè)DataFrame為例,我們可以根據(jù)行或列上的級(jí)別來進(jìn)行求和:

如果想要將DataFrame的一個(gè)或多個(gè)列當(dāng)做行索引來用,或者希望將行索引變成DataFrame的列,使用set_index函數(shù)和reset_index函數(shù)

六、面板數(shù)據(jù)

pandas有一個(gè)Panel數(shù)據(jù)結(jié)構(gòu),可以看做一個(gè)三維版的DataFrame。pandas的大部分開發(fā)工作都集中在表格型數(shù)據(jù)的操作上,因?yàn)檫@些數(shù)據(jù)更常見,而且層次化索引也使得多數(shù)情況下沒必要使用真正的N維數(shù)組。

可以使用DataFrame對(duì)象組成的字典或一個(gè)三維ndarray來創(chuàng)建Panel對(duì)象:

快速學(xué)習(xí):

第一節(jié) NumPy基礎(chǔ)(一)

第二節(jié) NumPy基礎(chǔ)(二)

第三節(jié) Pandas入門基礎(chǔ)

第四節(jié) 數(shù)據(jù)加載、存儲(chǔ)

第五節(jié) 數(shù)據(jù)清洗

第六節(jié) 數(shù)據(jù)合并、重塑

第七節(jié) 數(shù)據(jù)聚合與分組運(yùn)算

第八節(jié) 數(shù)據(jù)可視化

第九節(jié) pandas高級(jí)應(yīng)用

第十節(jié) 時(shí)間序列

第十一節(jié) Python建模庫(kù)

數(shù)據(jù)分析案例--1880-2010年間全美嬰兒姓名的處理

數(shù)據(jù)分析案例--MovieLens 1M數(shù)據(jù)集

數(shù)據(jù)分析案例--USA.gov數(shù)據(jù)

數(shù)據(jù)分析案例--2012聯(lián)邦選舉委員會(huì)數(shù)據(jù)庫(kù)

數(shù)據(jù)分析案例--USDA食品數(shù)據(jù)庫(kù)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容