查看: 78|回复: 0

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

[复制链接]

0

主题

0

回帖

0

积分

积极分子

金币
0
阅读权限
220
精华
0
威望
0
贡献
0
在线时间
0 小时
注册时间
2012-6-19
发表于 2026-1-7 10:49:19 | 显示全部楼层 |阅读模式

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

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

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

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

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

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

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

classpart1TPFPFNGT_count
cowv015106
cowv014015
dogv023214

目标是:

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

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

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 官方推荐(强烈建议)

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 数

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

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

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

相关侵权、举报、投诉及建议等,请发 E-mail:qiongdian@foxmail.com

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部