Pandas中g(shù)roupby+agg的兩種寫法區(qū)別小結(jié)
在使用 Pandas 做數(shù)據(jù)統(tǒng)計(jì)時(shí),groupby + agg 是繞不開的操作。
但很多人(包括我自己)在實(shí)際項(xiàng)目中都會遇到一個(gè)問題:
為什么明明只是做個(gè)統(tǒng)計(jì),結(jié)果 DataFrame 卻變成了 MultiIndex,
后面 merge、導(dǎo) Excel、畫圖全都開始報(bào)錯(cuò)?
追根溯源,問題往往出在:
?? groupby + agg 的寫法選錯(cuò)了
本文結(jié)合真實(shí)工程經(jīng)驗(yàn),詳細(xì)講清楚 Pandas 中 agg 的兩種常見寫法,以及為什么在工程場景下強(qiáng)烈推薦其中一種。
一、一個(gè)非常真實(shí)的使用場景
假設(shè)你在做檢測評測統(tǒng)計(jì),有如下數(shù)據(jù):
| class | part1 | TP | FP | FN | GT_count |
|---|---|---|---|---|---|
| cow | v01 | 5 | 1 | 0 | 6 |
| cow | v01 | 4 | 0 | 1 | 5 |
| dog | v02 | 3 | 2 | 1 | 4 |
目標(biāo)是:
按 class + part1 統(tǒng)計(jì) TP / FP / FN / GT 數(shù)量
二、第一種寫法:很多人最常用,但最容易踩坑
groupby_df = df.groupby(['class', 'part1']).agg(
{'TP': 'sum', 'FP': 'sum', 'FN': 'sum', 'GT_count': 'sum'}
)
這段代碼有問題嗎?
沒有。
但它返回的結(jié)果結(jié)構(gòu)是:
- class 和 part1 變成了 MultiIndex
- 統(tǒng)計(jì)結(jié)果才是列
也就是說,你拿到的是一張 多級索引 DataFrame。
MultiIndex 在工程中會帶來什么問題?
以下問題你大概率都會遇到:
- 導(dǎo)出 Excel 前必須 reset_index()
- 和其他表 merge 時(shí)經(jīng)常報(bào)錯(cuò)
- 新同事很難快速理解數(shù)據(jù)結(jié)構(gòu)
- 后面再算指標(biāo)時(shí)代碼變得很別扭
?? 分析階段還能接受,工程階段非常痛苦
三、第二種寫法:Pandas 官方推薦(強(qiáng)烈建議)
groupby_df = (
df.groupby(['class', 'part1'], as_index=False)
.agg(
TP=('TP', 'sum'),
FP=('FP', 'sum'),
FN=('FN', 'sum'),
GT=('GT_count', 'sum'),
)
)
返回結(jié)果是什么樣?
class | part1 | TP | FP | FN | GT
- 分組字段是普通列
- 沒有 MultiIndex
- 看起來就是一張“標(biāo)準(zhǔn)統(tǒng)計(jì)表”
四、兩種寫法的核心區(qū)別對比
| 對比點(diǎn) | 第一種寫法 | 第二種寫法 |
|---|---|---|
| 分組字段位置 | Index | 普通列 |
| 索引類型 | MultiIndex | 普通 Index |
| 是否需要 reset_index | 是 | 否 |
| 列名是否可控 | 否 | 是 |
| 擴(kuò)展復(fù)雜統(tǒng)計(jì) | 不優(yōu)雅 | 非常自然 |
| 工程實(shí)用性 | 較低 | 很高 |
五、真實(shí)項(xiàng)目中的差距會越來越大
當(dāng)統(tǒng)計(jì)需求升級,比如你還想算:
- 平均置信度
- 唯一 track 數(shù)
第一種寫法會越來越臃腫:
df.groupby(['class', 'part1']).agg({
'TP': 'sum',
'FP': 'sum',
'FN': 'sum',
'score': 'mean',
'track_id': 'nunique'
})
而第二種寫法依然清晰:
df.groupby(['class', 'part1'], as_index=False).agg(
TP=('TP', 'sum'),
FP=('FP', 'sum'),
FN=('FN', 'sum'),
avg_score=('score', 'mean'),
track_cnt=('track_id', 'nunique'),
)
到此這篇關(guān)于Pandas中g(shù)roupby+agg的兩種寫法區(qū)別小結(jié)的文章就介紹到這了,更多相關(guān)Pandas中g(shù)roupby+agg 內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python3.5面向?qū)ο蟪绦蛟O(shè)計(jì)之類的繼承和多態(tài)詳解
這篇文章主要介紹了Python3.5面向?qū)ο蟪绦蛟O(shè)計(jì)之類的繼承和多態(tài),結(jié)合實(shí)例形式詳細(xì)分析了Python3.5面向?qū)ο蟪绦蛟O(shè)計(jì)中類的繼承與多態(tài)常見用法及相關(guān)注意事項(xiàng),需要的朋友可以參考下2019-04-04
Using Django with GAE Python 后臺抓取多個(gè)網(wǎng)站的頁面全文
這篇文章主要介紹了Using Django with GAE Python 后臺抓取多個(gè)網(wǎng)站的頁面全文,需要的朋友可以參考下2016-02-02
python使用Plotly創(chuàng)建交互式數(shù)據(jù)可視化的操作步驟
Python 的 Plotly 庫是創(chuàng)建這種交互式可視化的強(qiáng)大工具,它提供了豐富的圖表類型和易于使用的接口,本文將探討如何使用 Plotly 創(chuàng)建交互式數(shù)據(jù)可視化,包括代碼實(shí)例和深入的解釋,需要的朋友可以參考下2024-08-08
Python作用域(局部?全局)及global關(guān)鍵字使用詳解
這篇文章主要為大家介紹了Python作用域(局部?全局)及global關(guān)鍵字使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-10-10
django manage.py擴(kuò)展自定義命令方法
今天小編就為大家分享一篇django manage.py擴(kuò)展自定義命令方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-05-05

