iT邦幫忙

2025 iThome 鐵人賽

DAY 12
0
Software Development

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

Day11: GroupBy | Filter | transform

  • 分享至 

  • xImage
  •  

filter()

今天用產銷履歷與有機蔬果行情資料來做練習。
https://data.gov.tw/dataset/126472

filter的功用是用分組後的dataframe做條件篩選。
符合條件的原始列會被保留,最後回傳被保留的原始列的子集合 (dataframe)

  • df.groupby(column_name).filter( function | lambda)
  • function跟lambda 必須傳入dataframe
  • function跟lambda 必須回傳true or false

以下程式碼就是將df以市場及作物代號分組後,只保留交易量總額大於1000的data

#可以用lambda
filtered = df.groupby("作物代號").filter(
              lambda g: g["交易量_公斤"].sum() > 1000)

#或是寫一個function
def filter_func(g):
    return g["交易量_公斤"].sum() > 1000

filtered = df.groupby("作物代號").filter(filter_func)

filter回傳的是一個dataframe,不再是groupby object。
所以不能在後面接agg或transform之類的函數。

transform()

df.groupby(column_name).transform(aggregate function | function | lambda)

一般的應用是新增一個欄位,把分組運算後的結果廣播到這個分組index的每個列上。
和agg()不同,agg做完列數會因為分組被壓縮,但transform原始列有幾列結果也會有幾列。
什麼時候會用到它呢?

  • 需要保留原始列
  • 要把分組結果寫回每列
    不消說,也是Pandas好朋友們相當必備的殺手技。
df["交易量平均"]= df.groupby("作物代號")["交易量_公斤"].transform("mean")
df["交易量百分比"]= df.groupby("作物代號")["交易量_公斤"].transform(lambda x: x/x.sum())

然後就會得到一個如下圖新增兩個欄位的df
https://ithelp.ithome.com.tw/upload/images/20250925/20178631c7RLH5jdiL.png
為了降低視覺干擾,我把作物代號rest過濾掉了。


上一篇
Day10: GroupBy | Multi Index | pipe | 自定函式
下一篇
Day12: Group | apply
系列文
從零開始Pandas-外加一點Matplotlib13
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言