天天看點

dataframe groupby_Pandas中groupby的這些用法你都知道嗎?

導讀

pandas作為Python資料分析的瑞士軍刀,內建了大量實用的功能接口,基本可以實作資料分析一站式處理。前期,筆者完成了一篇pandas系統入門教程,也針對幾個常用的分組統計接口進行了介紹,今天再針對groupby分組聚合操作進行拓展講解。

dataframe groupby_Pandas中groupby的這些用法你都知道嗎?

01 如何了解pandas中的groupby操作

groupby是pandas中用于資料分析的一個重要功能,其功能與SQL中的分組操作類似,但功能卻更為強大。了解groupby的原理可參考官網給出的解釋:

dataframe groupby_Pandas中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參數指定是否對輸出結果按索引排序

另有其他參數,但很少用到不再列出。給出幾個典型應用示例:

dataframe groupby_Pandas中groupby的這些用法你都知道嗎?

示例資料

  • 單列作為分組字段,不設定索引
dataframe groupby_Pandas中groupby的這些用法你都知道嗎?
  • 單列字段的轉換格式作為分組字段
dataframe groupby_Pandas中groupby的這些用法你都知道嗎?
  • 字典,根據索引對記錄進行映射分組
dataframe groupby_Pandas中groupby的這些用法你都知道嗎?
  • 函數,根據函數對索引的執行結果進行分組
dataframe groupby_Pandas中groupby的這些用法你都知道嗎?

03 轉換(apply)——agg/apply/transform

分組之後的第二個步驟即為分組轉換操作,也就是應用(apply)一定的函數得到相應的結果。常用的執行操作方式有4種:

  • 直接加聚合函數,但隻能實作單一功能,常用聚合函數包括:mean/sum/median/min/max/last/first等,最為簡單直接的聚合方式
  • agg(或aggregate),執行更為豐富的聚合功能,常用清單、字典等形式作為參數

例如需要對如上資料表中兩門課程分别統計平均分和最低分,則可用清單形式傳參如下:

dataframe groupby_Pandas中groupby的這些用法你都知道嗎?

如果想對國文課求平均分和最低分,而數學課求平均分和最高分,則可用字典形式參數:

dataframe groupby_Pandas中groupby的這些用法你都知道嗎?
  • apply,除了agg豐富的可選聚合函數外,apply還可以自定義面向分組的聚合函數

這裡apply函數實際上是一個應用非常廣泛的轉換函數,例如面向series對象,apply函數的處理粒度是series的每個元素(标量);面向dataframe對象,apply函數的處理粒度是dataframe的一行或一列(series對象);而現在面向groupby後的group對象,其處理粒度則是一個分組(dataframe對象)。例如,需要計算每個班級國文平均分與數學平均分之差,則用apply會是一個理想的選擇:

dataframe groupby_Pandas中groupby的這些用法你都知道嗎?
  • transform,又一個強大的groupby利器,其與agg和apply的差別相當于SQL中視窗函數和分組聚合的差別:transform并不對資料進行聚合輸出,而隻是對每一行記錄提供了相應聚合結果;而後兩者則是聚合後的分組輸出。

例如,想對比個人成績與班級平均分,則如下操作會是首選:

dataframe groupby_Pandas中groupby的這些用法你都知道嗎?

當然,這一操作也可以通過mean聚合+merge連接配接實作:

dataframe groupby_Pandas中groupby的這些用法你都知道嗎?
實際上,pandas中幾乎所有需求都存在不止一種實作方式!

04 時間序列的groupby——resample

再次指出,groupby相當于是按照某一規則對資料進行分組聚合,當分組的規則是時間序列時,還存在另一種特殊的分組方式——重采樣resample。了解groupby的split-apply-combine三步走處理流程,那麼自然也很容易了解resample處理流程:按照時間split——apply——combine。同時,也正因為resample是一種特殊的分組聚合,是以groupby的4種轉換操作自然也都适用于resample。

生成以下含有時間序列的樣例資料:

dataframe groupby_Pandas中groupby的這些用法你都知道嗎?

需統計每15天的平均分數,用resample可實作如下:

dataframe groupby_Pandas中groupby的這些用法你都知道嗎?

當然,這是直接用了聚合函數,更複雜的例如agg、apply和transform等用法也是一樣的。換句話說,resample與groupby的核心差別僅在于split階段:前者按照時間間隔進行分組,而後者是按照定義的某種規則進行分組。

另外,還可将groupby與resample鍊式使用,但僅可以是resample在groupby之後,反之則會報錯。例如:

dataframe groupby_Pandas中groupby的這些用法你都知道嗎?
需要指出,resample等價于groupby操作一般是指下采樣過程;同時,resample也支援上采樣,此時需設定一定規則進行插值填充。
dataframe groupby_Pandas中groupby的這些用法你都知道嗎?

相關閱讀:

  • 臨行在即,分享一個自己寫的sklearn源碼庫
  • python資料科學系列:seaborn入門詳細教程
  • python資料科學系列:pandas入門詳細教程
  • python資料科學系列:matplotlib入門詳細教程
  • python資料科學系列:numpy入門詳細教程

繼續閱讀