導讀
pandas作為Python資料分析的瑞士軍刀,內建了大量實用的功能接口,基本可以實作資料分析一站式處理。前期,筆者完成了一篇pandas系統入門教程,也針對幾個常用的分組統計接口進行了介紹,今天再針對groupby分組聚合操作進行拓展講解。
01 如何了解pandas中的groupby操作
groupby是pandas中用于資料分析的一個重要功能,其功能與SQL中的分組操作類似,但功能卻更為強大。了解groupby的原理可參考官網給出的解釋:
其中:
- split:按照某一原則(groupby字段)進行拆分,相同屬性分為一組
- apply:對拆分後的各組執行相應的轉換操作
- combine:輸出彙總轉換後的各組結果
02 分組(split)——groupby
groupby首先要指定分組原則,這也是groupby函數的第一步,其常用參數包括:
- by,分組字段,可以是列名/series/字典/函數,常用為列名
- axis,指定切分方向,預設為0,表示沿着行切分
- as_index,是否将分組列名作為輸出的索引,預設為True;當設定為False時相當于加了reset_index功能
- sort,與SQL中groupby操作會預設執行排序一緻,該groupby也可通過sort參數指定是否對輸出結果按索引排序
另有其他參數,但很少用到不再列出。給出幾個典型應用示例:
示例資料
- 單列作為分組字段,不設定索引
- 單列字段的轉換格式作為分組字段
- 字典,根據索引對記錄進行映射分組
- 函數,根據函數對索引的執行結果進行分組
03 轉換(apply)——agg/apply/transform
分組之後的第二個步驟即為分組轉換操作,也就是應用(apply)一定的函數得到相應的結果。常用的執行操作方式有4種:
- 直接加聚合函數,但隻能實作單一功能,常用聚合函數包括:mean/sum/median/min/max/last/first等,最為簡單直接的聚合方式
- agg(或aggregate),執行更為豐富的聚合功能,常用清單、字典等形式作為參數
例如需要對如上資料表中兩門課程分别統計平均分和最低分,則可用清單形式傳參如下:
如果想對國文課求平均分和最低分,而數學課求平均分和最高分,則可用字典形式參數:
- apply,除了agg豐富的可選聚合函數外,apply還可以自定義面向分組的聚合函數
這裡apply函數實際上是一個應用非常廣泛的轉換函數,例如面向series對象,apply函數的處理粒度是series的每個元素(标量);面向dataframe對象,apply函數的處理粒度是dataframe的一行或一列(series對象);而現在面向groupby後的group對象,其處理粒度則是一個分組(dataframe對象)。例如,需要計算每個班級國文平均分與數學平均分之差,則用apply會是一個理想的選擇:
- transform,又一個強大的groupby利器,其與agg和apply的差別相當于SQL中視窗函數和分組聚合的差別:transform并不對資料進行聚合輸出,而隻是對每一行記錄提供了相應聚合結果;而後兩者則是聚合後的分組輸出。
例如,想對比個人成績與班級平均分,則如下操作會是首選:
當然,這一操作也可以通過mean聚合+merge連接配接實作:
實際上,pandas中幾乎所有需求都存在不止一種實作方式!
04 時間序列的groupby——resample
再次指出,groupby相當于是按照某一規則對資料進行分組聚合,當分組的規則是時間序列時,還存在另一種特殊的分組方式——重采樣resample。了解groupby的split-apply-combine三步走處理流程,那麼自然也很容易了解resample處理流程:按照時間split——apply——combine。同時,也正因為resample是一種特殊的分組聚合,是以groupby的4種轉換操作自然也都适用于resample。
生成以下含有時間序列的樣例資料:
需統計每15天的平均分數,用resample可實作如下:
當然,這是直接用了聚合函數,更複雜的例如agg、apply和transform等用法也是一樣的。換句話說,resample與groupby的核心差別僅在于split階段:前者按照時間間隔進行分組,而後者是按照定義的某種規則進行分組。
另外,還可将groupby與resample鍊式使用,但僅可以是resample在groupby之後,反之則會報錯。例如:
需要指出,resample等價于groupby操作一般是指下采樣過程;同時,resample也支援上采樣,此時需設定一定規則進行插值填充。
相關閱讀:
- 臨行在即,分享一個自己寫的sklearn源碼庫
- python資料科學系列:seaborn入門詳細教程
- python資料科學系列:pandas入門詳細教程
- python資料科學系列:matplotlib入門詳細教程
- python資料科學系列:numpy入門詳細教程