第六課 - Pandas進階
本課內(nèi)容:
? ? ? ?數(shù)據(jù)的分組和聚合
? ? ? ? ? ? ? ?pandas groupby 方法
? ? ? ? ? ? ? ?pandas agg 方法
? ? ? ? ? ? ? ?pandas apply 方法
? ? ? ?案例講解
? ? ? ? ? ? ? 鳶尾花案例
? ? ? ? ? ? ? 嬰兒姓名案
數(shù)據(jù)的分組&聚合 -- 什么是groupby 技術(shù)?
在數(shù)據(jù)分析中,我們往往需要在將數(shù)據(jù)拆分,在每一個特定的組里進行運算。比如根據(jù)教育水平和年齡段計算某個城市的工作人口的平均收入。
pandas中的groupby提供了一個高效的數(shù)據(jù)的分組運算。
我們通過一個或者多個分類變量將數(shù)據(jù)拆分,然后分別在拆分以后的數(shù)據(jù)上進行需要的計算
我們可以把上述過程理解為三部:
1.拆分數(shù)據(jù)(split)?
2.應用某個函數(shù)(apply)?
3.匯總計算結(jié)果(aggregate)
下面這個演示圖展示了“分拆-應用-匯總”的groupby思想
上圖所示,分解步驟:
Step1 :數(shù)據(jù)分組——?groupby 方法
Step2 :數(shù)據(jù)聚合:
? ? ?使用內(nèi)置函數(shù)——sum / mean / max / min / count等
? ? ?使用自定義函數(shù)——?agg ( aggregate ) 方法
? ? ?自定義更豐富的分組運算—— apply 方法
案例1: 讓我們來回顧下經(jīng)典的iris數(shù)據(jù)
鳶尾花卉數(shù)據(jù)集,來源 UCI 機器學習數(shù)據(jù)集
四個特征被用作樣本的定量分析,它們分別是花萼(sepal)和花瓣(petal)的長度(length)和寬度(width)
我們來復習一下上節(jié)課的 導入鳶尾花數(shù)據(jù),
這些例子為了導入后面的課程??
1.1 分組運算 groupby 方法 -- 使用內(nèi)置函數(shù)
鳶尾花數(shù)據(jù)中包括了3個不同的品種150個觀測對象,數(shù)據(jù)分析中我們往往對一個品種的特性更感興趣而不是每一個個體的數(shù)據(jù)描述。 假如一個植物園管理員提出這個問題:
按品種劃分,每個品種的花萼,花瓣的長度和寬度的最大值分別是多少?
我們應該如何回答?
使用上述groupby的思想,我們可以將數(shù)據(jù)劃分為3個小塊,每個小塊包含50個觀測數(shù)據(jù)。然后使用max函數(shù)得到各個測量值的最大值,然后進行匯總。
第7 條其實輸出和第5條是一樣第結(jié)果。
1.2 使用自定義函數(shù)進行聚合運算 -- agg 方法
當計算變得復雜時,內(nèi)置函數(shù)可能無法處理
我們需要自定義一個函數(shù)來進行計算, 傳入一個數(shù)組做參數(shù),返回一個標量的結(jié)果。
groupby對象的agg/aggregate方法可以實現(xiàn)上述功能。
計算每個品種所有屬性(花瓣、花萼的長度和寬度)數(shù)值的跨度范圍,即最大值減去最小值
首先要先定義一個函數(shù),range_iris(arr)
層次化索引。
在首行有簡單標簽后,想要細分列表的內(nèi)容的時候,比如下圖,知道花萼長度,還想知道花萼長度中的平均值,最大值,和數(shù)值的跨度范圍,我們是可以這樣操作的:
在 agg函數(shù)中不僅可以針對同一種函數(shù),還可以通過不同的列,應用到不同的聚合函數(shù)。比如說下圖,需要花瓣寬度的最小值,和花瓣長度的跨度數(shù)差,這是需要輸出不同列的數(shù)據(jù),用agg自定義函數(shù)也是可以實現(xiàn)的。
注意里面使用的是字典類型,久違的大括號,久違的鍵值對。鍵值對里面的內(nèi)容表示的是需要運用的聚合函數(shù)。我的理解就是在這里又要重新組建一個新的家庭了,大列是 petal_width,再細分小列是 min。左邊的species 列首是上面已經(jīng)定義的 iris.groupby('species') 函數(shù),后綴內(nèi)容是在這個定義好的函數(shù)基礎(chǔ)上找的數(shù)據(jù),也就是我們需要的輸出,基于數(shù)據(jù)源 iris。
作為一個新手,注意點還是在括號上。。。這里有三層括號啊!
[ ]表示鍵值對里面的值,保護起來不和外面的連在一起產(chǎn)生歧義;
{ } 表示里面是字典類型;
( )表示函數(shù)內(nèi)容。 。哈哈以上都是我的理解,不知道有沒有出錯。
1.3 更廣泛的分組運算 -- apply方法
agg 方法將一個函數(shù)使用在一個數(shù)列上,然后返回一個標量的值。
apply 是一個更一般化的方法:將一個數(shù)據(jù)分拆-應用-匯總
使用apply的方法是為了更加一般化和多元化,因為有時候返回的值不一定是一個標量的值,有可能是一個數(shù)組或是其他類型。
提取每個品種前n個觀測值作為一個樣本
上面的代碼中,df 代表我傳遞給它的DataFrame數(shù)據(jù),n代表取它的前n行,在這里,n的默認值是3,也就是說在調(diào)用這個函數(shù)的時候,如果沒有其他情況,n值等于3。那這個函數(shù)的返回值就是這個函數(shù)的前n行,即 0-3行。在這個時候,agg的方法就不管用的,要是強行使用,就會出錯。
來,演示一遍錯誤!
又是一屏裝不下的錯誤。。。拉到最后的錯誤提示
這里的錯誤告訴我們,不能講一個長度是5的序列復制在一個維度是3 的數(shù)組數(shù)據(jù)上,其實就是告訴我們自定義函數(shù)的first_n 有3個返回值,這時候的agg函數(shù)就不適用了。因為agg這個函數(shù)只能返回一個標量的值
好吧,上面大部分都是余老師說的,我好像碼字碼到這里,才有點明白為什么要演示錯誤的例子——因為要表明我們之前學的 agg 不夠用啦!超出這個范圍的可以用新的 apply 呀!
我們得到了按品種劃分的數(shù)據(jù),每一個分類有前4行的數(shù)據(jù),也就是n=4.
階段小結(jié):
我們主要講了如何將數(shù)據(jù)根據(jù)某些條件分拆為幾個子數(shù)據(jù),然后在每個子數(shù)據(jù)上進行計算從而得到所要的結(jié)果。
主要思想是分拆-應用-匯總。
對于一些簡單的計算,比如最大值最小值的計算,我們可以直接使用groupby之后采用相應的內(nèi)置方法。
對于一些更為復雜的計算,我們需要自己定義函數(shù)然后應用到拆分后的子數(shù)據(jù)上。根據(jù)具體要求來決定使用agg方法還是apply方法。
作業(yè)6-1:
1,計算每個品種鳶尾花各個屬性(花萼、花瓣的長度和寬度)的最小值、平均值又是分別是多少? (提示:使用min、mean 方法。)
2,計算鳶尾花每個品種的花萼長度(sepal_length) 大于6cm的數(shù)據(jù)個數(shù)。
下一篇的內(nèi)容是第六課 Pandas進階的案例2:?美國嬰兒名字數(shù)據(jù)