文科生學Python系列11:Pandas進階(鳶尾花案例:groupby, agg, apply)

第六課 - Pandas進階

本課內容:

? ? ? ?數據的分組和聚合

? ? ? ? ? ? ? ?pandas groupby 方法

? ? ? ? ? ? ? ?pandas agg 方法

? ? ? ? ? ? ? ?pandas apply 方法

? ? ? ?案例講解

? ? ? ? ? ? ? 鳶尾花案例

? ? ? ? ? ? ? 嬰兒姓名案

數據的分組&聚合 -- 什么是groupby 技術?

在數據分析中,我們往往需要在將數據拆分,在每一個特定的組里進行運算。比如根據教育水平和年齡段計算某個城市的工作人口的平均收入。

pandas中的groupby提供了一個高效的數據的分組運算。

我們通過一個或者多個分類變量將數據拆分,然后分別在拆分以后的數據上進行需要的計算

我們可以把上述過程理解為三部:

1.拆分數據(split)?

2.應用某個函數(apply)?

3.匯總計算結果(aggregate)

下面這個演示圖展示了“分拆-應用-匯總”的groupby思想

上圖所示,分解步驟:

Step1 :數據分組——?groupby 方法

Step2 :數據聚合:

? ? ?使用內置函數——sum / mean / max / min / count等

? ? ?使用自定義函數——?agg ( aggregate ) 方法

? ? ?自定義更豐富的分組運算—— apply 方法


案例1: 讓我們來回顧下經典的iris數據

鳶尾花卉數據集,來源 UCI 機器學習數據集

四個特征被用作樣本的定量分析,它們分別是花萼(sepal)和花瓣(petal)的長度(length)和寬度(width)

導入鳶尾花數據

我們來復習一下上節(jié)課的 導入鳶尾花數據,

統(tǒng)計每個品種的數據量

這些例子為了導入后面的課程??

1.1 分組運算 groupby 方法 -- 使用內置函數

鳶尾花數據中包括了3個不同的品種150個觀測對象,數據分析中我們往往對一個品種的特性更感興趣而不是每一個個體的數據描述。 假如一個植物園管理員提出這個問題:

按品種劃分,每個品種的花萼,花瓣的長度和寬度的最大值分別是多少?

我們應該如何回答?

使用上述groupby的思想,我們可以將數據劃分為3個小塊,每個小塊包含50個觀測數據。然后使用max函數得到各個測量值的最大值,然后進行匯總。

按品種劃分,每個品種的花萼,花瓣的長度和寬度的最大值分別是多少?


用size方法查看每個group的大小

第7 條其實輸出和第5條是一樣第結果。

1.2 使用自定義函數進行聚合運算 -- agg 方法

當計算變得復雜時,內置函數可能無法處理

我們需要自定義一個函數來進行計算, 傳入一個數組做參數,返回一個標量的結果。

groupby對象的agg/aggregate方法可以實現上述功能。

計算每個品種所有屬性(花瓣、花萼的長度和寬度)數值的跨度范圍,即最大值減去最小值

首先要先定義一個函數,range_iris(arr)

自定義函數agg得出數值的跨度范圍

層次化索引。

在首行有簡單標簽后,想要細分列表的內容的時候,比如下圖,知道花萼長度,還想知道花萼長度中的平均值,最大值,和數值的跨度范圍,我們是可以這樣操作的:

層次化索引

在 agg函數中不僅可以針對同一種函數,還可以通過不同的列,應用到不同的聚合函數。比如說下圖,需要花瓣寬度的最小值,和花瓣長度的跨度數差,這是需要輸出不同列的數據,用agg自定義函數也是可以實現的。

針對不同的列,應用不同的聚合函數

注意里面使用的是字典類型,久違的大括號,久違的鍵值對。鍵值對里面的內容表示的是需要運用的聚合函數。我的理解就是在這里又要重新組建一個新的家庭了,大列是 petal_width,再細分小列是 min。左邊的species 列首是上面已經定義的 iris.groupby('species') 函數,后綴內容是在這個定義好的函數基礎上找的數據,也就是我們需要的輸出,基于數據源 iris。

作為一個新手,注意點還是在括號上。。。這里有三層括號??!

[ ]表示鍵值對里面的值,保護起來不和外面的連在一起產生歧義;

{ } 表示里面是字典類型;

( )表示函數內容。 。哈哈以上都是我的理解,不知道有沒有出錯。


1.3 更廣泛的分組運算 -- apply方法

agg 方法將一個函數使用在一個數列上,然后返回一個標量的值。

apply 是一個更一般化的方法:將一個數據分拆-應用-匯總

使用apply的方法是為了更加一般化和多元化,因為有時候返回的值不一定是一個標量的值,有可能是一個數組或是其他類型。

提取每個品種前n個觀測值作為一個樣本

自定義函數

上面的代碼中,df 代表我傳遞給它的DataFrame數據,n代表取它的前n行,在這里,n的默認值是3,也就是說在調用這個函數的時候,如果沒有其他情況,n值等于3。那這個函數的返回值就是這個函數的前n行,即 0-3行。在這個時候,agg的方法就不管用的,要是強行使用,就會出錯。

來,演示一遍錯誤!

使用agg的錯誤顯示

又是一屏裝不下的錯誤。。。拉到最后的錯誤提示

這里的錯誤告訴我們,不能講一個長度是5的序列復制在一個維度是3 的數組數據上,其實就是告訴我們自定義函數的first_n 有3個返回值,這時候的agg函數就不適用了。因為agg這個函數只能返回一個標量的值

好吧,上面大部分都是余老師說的,我好像碼字碼到這里,才有點明白為什么要演示錯誤的例子——因為要表明我們之前學的 agg 不夠用啦!超出這個范圍的可以用新的 apply 呀!

apply 方法

我們得到了按品種劃分的數據,每一個分類有前4行的數據,也就是n=4.


階段小結:

我們主要講了如何將數據根據某些條件分拆為幾個子數據,然后在每個子數據上進行計算從而得到所要的結果。

主要思想是分拆-應用-匯總。

對于一些簡單的計算,比如最大值最小值的計算,我們可以直接使用groupby之后采用相應的內置方法。

對于一些更為復雜的計算,我們需要自己定義函數然后應用到拆分后的子數據上。根據具體要求來決定使用agg方法還是apply方法。


作業(yè)6-1:

1,計算每個品種鳶尾花各個屬性(花萼、花瓣的長度和寬度)的最小值、平均值又是分別是多少? (提示:使用min、mean 方法。)

2,計算鳶尾花每個品種的花萼長度(sepal_length) 大于6cm的數據個數。


下一篇的內容是第六課 Pandas進階的案例2:?美國嬰兒名字數據

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

相關閱讀更多精彩內容

友情鏈接更多精彩內容