iT邦幫忙

2025 iThome 鐵人賽

DAY 10
0
Software Development

從零開始Pandas-外加一點Matplotlib系列 第 10

Day9: GroupBy...的上集 | agg()

  • 分享至 

  • xImage
  •  

Groupby是資料分析中最基本的工作,先將資料分組再做統計運算。這種機制存在已久,稱為split-apply-combine,也就是把資料按鍵分組 (Split) → 對每組套函數 (Apply) → 合併結果 (Combine)。譬如統計薪水時,一般以年齡段分區的薪水中位數,再上其他特徵資料,畢竟光是一個全台灣的薪水的中位數可能以資料來說沒太多價值。

這是一個常用到到必須上手的功能,好家在熊貓師父依然強大,把這些以前用程式兜到大腦膨脹的邏輯做的極好上手,有多好上手呢,我們開始吧。

GroupBy的語法

語法可以是下面兩種形式

  • DataFrame.groupby("分組欄位").agg({"被運算欄位": "聚合函數"})
  • DataFrame.groupby("分組欄位")["被運算欄位"].agg("聚合函數")

以上usage是單一分組、單一欄位、單一聚合運算,但是要多重在pandas也是易如反掌

  1. 多個欄位的分組:分組欄位改陣列。
  2. 多個欄位的運算:運算欄位改陣列。
    但如果是用["被運算欄位"]要外層再包一層中括號 → [["運算欄位1","運算欄位2"...]]
  3. 多種運算方式:聚合函數改陣列。
  4. 用[]中括號的用法若只有一個被運算欄位也只有一個聚合函數會回傳series,其他回傳dataframe

直接來看程式。


#這兩個一樣
flys.groupby("LINE").agg({"DELAY":"sum"})
flys.groupby("LINE")["DELAY"].agg("sum")

#獲得多個聚合函數結果
flys.groupby("LINE").agg({"DELAY":["sum","min", "max"]})
flys.groupby("LINE")["DELAY"].agg(["sum", "min", "max"])

#多個分組欄位
flys.groupby(["LINE","WEEKDAY"]).agg({"DELAY":"sum"})
flys.groupby(["LINE","WEEKDAY"])["DELAY"].agg("sum")

#多個運算欄位
flys.groupby("LINE").agg({"CANCELLED":"sum", "DIVERTED":"sum"})
flys.groupby("LINE")[["CANCELLED","DIVERTED"]].agg("sum")


#全部加滿,有換行的記得用大括號包起來
(flys.groupby(["LINE","WEEKDAY"]).agg({"CANCELLED":["sum", "mean", "max", "min"],
                                            "DIVERTED":["sum", "mean", "max", "min"]}))
(flys.groupby(["LINE","WEEKDAY"])[["CANCELLED","DIVERTED"]]
                                     .agg(["sum", "mean", "max", "min"]))

執行最後的groupby會是這樣
https://ithelp.ithome.com.tw/upload/images/20250923/20178631ELMGzEDOiu.png

是不是
https://ithelp.ithome.com.tw/upload/images/20250923/20178631xpIHkFiD6C.png

GroupBy物件

GroupBy物件提供了很多實用的方法,即使不做聚合函數,要取得分組資訊也很方便。
grouped = flys.groupby(["LINE","WEEKDAY"])
dataframe點完groupby欄位後,什麼都不要加就能得到一個GroupBy object。

  • 查看group組別數量
    grouped.ngroups
  • 取得分組的索引標籤,有幾個分組欄位,就會是由幾個元素組成的tuple
    list(grouped.groups)
  • 用索引標籤取得該group組內資料
    grouped.get_group(('GroupColumn1','GroupColumn2'))
  • 在迭代中顯示每個組別的前3筆資料
#要先import: from IPython.display import display
for name, group in grouped:
    print(name)
    display(group.head(3))
  • nth直接取得每組的第N筆資料 (可以多筆)
    grouped.nth(n, dropna=None)
    • n:整數或整數列表
    • 0 → 每組的第一筆
    • 1 → 每組的第二筆
    • -1 → 每組的最後一筆
    • [0,1,-1] → 多個位置

明天繼續groupby的旅程。


上一篇
Day8: Index和排序
系列文
從零開始Pandas-外加一點Matplotlib10
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言