当前位置: 首页 > news >正文

Pandas中groupby+agg的两种写法区别小结

在使用 Pandas 做数据统计时,groupby + agg是绕不开的操作。

但很多人(包括我自己)在实际项目中都会遇到一个问题:

为什么明明只是做个统计,结果 DataFrame 却变成了 MultiIndex,
后面 merge、导 Excel、画图全都开始报错?

追根溯源,问题往往出在:
👉groupby + agg的写法选错了

本文结合真实工程经验,详细讲清楚 Pandas 中 agg 的两种常见写法,以及为什么在工程场景下强烈推荐其中一种。

一、一个非常真实的使用场景

假设你在做检测评测统计,有如下数据:

classpart1TPFPFNGT_count
cowv015106
cowv014015
dogv023214

目标是:

按 class + part1 统计 TP / FP / FN / GT 数量

二、第一种写法:很多人最常用,但最容易踩坑

1

2

3

groupby_df=df.groupby(['class','part1']).agg(

{'TP':'sum','FP':'sum','FN':'sum','GT_count':'sum'}

)

这段代码有问题吗?
没有。

但它返回的结果结构是:

  • class 和 part1 变成了 MultiIndex
  • 统计结果才是列

也就是说,你拿到的是一张多级索引 DataFrame。

MultiIndex 在工程中会带来什么问题?

以下问题你大概率都会遇到:

  • 导出 Excel 前必须 reset_index()
  • 和其他表 merge 时经常报错
  • 新同事很难快速理解数据结构
  • 后面再算指标时代码变得很别扭

👉 分析阶段还能接受,工程阶段非常痛苦

三、第二种写法:Pandas 官方推荐(强烈建议)

1

2

3

4

5

6

7

8

9

groupby_df=(

df.groupby(['class','part1'], as_index=False)

.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 数

第一种写法会越来越臃肿:

1

2

3

4

5

6

7

df.groupby(['class','part1']).agg({

'TP':'sum',

'FP':'sum',

'FN':'sum',

'score':'mean',

'track_id':'nunique'

})

而第二种写法依然清晰:

1

2

3

4

5

6

7

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'),

)

http://www.jsqmd.com/news/583589/

相关文章:

  • Flowable 7.x 实战:手把手教你从前端按钮到后端接口,完整实现流程图查看功能
  • 告别瞎猜!用ClimateAP数据为你的花园/农场做精准气候规划(含MAT, NFFD, PAS等变量实操)
  • 用闲置树莓派打造个人博客服务器,从硬件到上线全攻略
  • 低浓度瓦斯利用:安全与效能的双向突破
  • 手把手教你用Wireshark抓包分析华为GRE over IPsec的完整封装过程
  • 用YOLOv8-pose玩点不一样的:手把手教你用Python+OpenCV把姿态关键点画成卡通小人
  • 别只盯着huggingface!用Modelscope一键搞定PDFMathTranslate的DocLayout-YOLO模型依赖
  • 手把手玩转CNN电池健康诊断
  • 深度相机技术解析:从原理到应用
  • 无痛人流三天能出门吗?术后出行与身体恢复科学指南
  • 只会CRUD必看!PyTorch On Java实战:Java原生写大模型
  • 软考培训机构防套路手册:从师资甄别到合同陷阱的7个关键检查点
  • MATLAB 2012b许可证过期怎么办?两种实测有效的解决方法(附License文件下载)
  • 初来乍到,还请多多支持
  • 从零构建Profinet协议栈:FPGA实现与Github开源实践
  • 深入解析PaddlePaddle GPU版本Segmentation fault问题及解决方案
  • Visa定义商业新时代:当AI成为消费主体
  • 低浓度瓦斯资源化利用:技术突围与产业落地新路径
  • 企业微信JS-SDK实战:精准获取用户地理位置与逆解析实现
  • NumPy 从数值范围创建数组
  • C++ 大规模系统构建:分析基于 Bazel 或 CMake 的 C++ 增量编译优化与物理依赖图谱的剪枝策略
  • 告别SDK迷宫:手把手教你用CCS12.1.0为TMS320F280039搭建纯净工程骨架(附文件屏蔽指南)
  • 雅诗兰黛集团 全面确立“One ELC”运营模式,利润复苏与增长计划取得里程碑进展
  • MATLAB实战:3种扩频码捕获方法对比(附完整仿真代码)
  • TTL门电路入门:从三极管到逻辑门的实战解析(附常见问题排查)
  • 前端安全吐槽:别再让你的网站像筛子一样漏洞百出!
  • 降AI率低至2%:SpeedAI科研小助手,论文过审省心利器
  • GitHub精选:5款高效开源校园管理系统助力教育数字化转型
  • Python图像识别自动化避坑指南:为什么你的PyAutoGUI脚本总点不准?
  • 药流会不会落下月子病?药流后修护要点