Pandas中groupby+agg的两种写法区别小结
在使用 Pandas 做数据统计时groupby agg是绕不开的操作。但很多人包括我自己在实际项目中都会遇到一个问题为什么明明只是做个统计结果 DataFrame 却变成了 MultiIndex后面 merge、导 Excel、画图全都开始报错追根溯源问题往往出在groupby agg的写法选错了本文结合真实工程经验详细讲清楚 Pandas 中 agg 的两种常见写法以及为什么在工程场景下强烈推荐其中一种。一、一个非常真实的使用场景假设你在做检测评测统计有如下数据classpart1TPFPFNGT_countcowv015106cowv014015dogv023214目标是按 class part1 统计 TP / FP / FN / GT 数量二、第一种写法很多人最常用但最容易踩坑123groupby_dfdf.groupby([class,part1]).agg({TP:sum,FP:sum,FN:sum,GT_count:sum})这段代码有问题吗没有。但它返回的结果结构是class 和 part1 变成了 MultiIndex统计结果才是列也就是说你拿到的是一张多级索引 DataFrame。MultiIndex 在工程中会带来什么问题以下问题你大概率都会遇到导出 Excel 前必须 reset_index()和其他表 merge 时经常报错新同事很难快速理解数据结构后面再算指标时代码变得很别扭 分析阶段还能接受工程阶段非常痛苦三、第二种写法Pandas 官方推荐强烈建议123456789groupby_df(df.groupby([class,part1], as_indexFalse).agg(TP(TP,sum),FP(FP,sum),FN(FN,sum),GT(GT_count,sum),))返回结果是什么样class | part1 | TP | FP | FN | GT分组字段是普通列没有 MultiIndex看起来就是一张“标准统计表”四、两种写法的核心区别对比对比点第一种写法第二种写法分组字段位置Index普通列索引类型MultiIndex普通 Index是否需要 reset_index是否列名是否可控否是扩展复杂统计不优雅非常自然工程实用性较低很高五、真实项目中的差距会越来越大当统计需求升级比如你还想算平均置信度唯一 track 数第一种写法会越来越臃肿1234567df.groupby([class,part1]).agg({TP:sum,FP:sum,FN:sum,score:mean,track_id:nunique})而第二种写法依然清晰1234567df.groupby([class,part1], as_indexFalse).agg(TP(TP,sum),FP(FP,sum),FN(FN,sum),avg_score(score,mean),track_cnt(track_id,nunique),)