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

 更新时间:2026年01月07日 10:49:19   作者:司徒轩宇  
Pandas中groupby+agg操作存在两种常见写法,第一种会将分组字段转为MultiIndex,导致后续处理困难,第二种通过as_index=False保持分组字段为普通列,更适用于工程场景,两种写法核心区别在于索引类型、列名控制和扩展性,下面就来详细的介绍一下

在使用 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'),
)

到此这篇关于Pandas中groupby+agg的两种写法区别小结的文章就介绍到这了,更多相关Pandas中groupby+agg 内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Python3.5面向对象程序设计之类的继承和多态详解

    Python3.5面向对象程序设计之类的继承和多态详解

    这篇文章主要介绍了Python3.5面向对象程序设计之类的继承和多态,结合实例形式详细分析了Python3.5面向对象程序设计中类的继承与多态常见用法及相关注意事项,需要的朋友可以参考下
    2019-04-04
  • 彻底卸载anaconda详细教程(推荐!)

    彻底卸载anaconda详细教程(推荐!)

    用anaconda更改我的python版本,就是出现了冻结无法更改等等之类的问题,担心更新anaconda还是会出错,于是打算卸载anaconda,重新下载一个安装,下面这篇文章主要给大家介绍了关于彻底卸载anaconda的相关资料,需要的朋友可以参考下
    2022-11-11
  • python中的zip模块

    python中的zip模块

    这篇文章主要介绍了zip文件格式是通用的文档压缩标准,在ziplib模块中,使用ZipFile类来操作zip文件,感兴趣的朋友参考如下
    2021-08-08
  • Using Django with GAE Python 后台抓取多个网站的页面全文

    Using Django with GAE Python 后台抓取多个网站的页面全文

    这篇文章主要介绍了Using Django with GAE Python 后台抓取多个网站的页面全文,需要的朋友可以参考下
    2016-02-02
  • python使用Plotly创建交互式数据可视化的操作步骤

    python使用Plotly创建交互式数据可视化的操作步骤

    Python 的 Plotly 库是创建这种交互式可视化的强大工具,它提供了丰富的图表类型和易于使用的接口,本文将探讨如何使用 Plotly 创建交互式数据可视化,包括代码实例和深入的解释,需要的朋友可以参考下
    2024-08-08
  • Python作用域(局部 全局)及global关键字使用详解

    Python作用域(局部 全局)及global关键字使用详解

    这篇文章主要为大家介绍了Python作用域(局部 全局)及global关键字使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-10-10
  • python按行读取文件并找出其中指定字符串

    python按行读取文件并找出其中指定字符串

    这篇文章主要介绍了python按行读取文件并找出其中指定字符串的方法,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-08-08
  • django manage.py扩展自定义命令方法

    django manage.py扩展自定义命令方法

    今天小编就为大家分享一篇django manage.py扩展自定义命令方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-05-05
  • 使用OpenCV实现逐帧获取视频图片

    使用OpenCV实现逐帧获取视频图片

    这篇文章主要为大家详细介绍了如何使用OpenCV实现逐帧获取视频中的图片用来标注,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-03-03
  • LeetCode百钱买百鸡python递归解法示例

    LeetCode百钱买百鸡python递归解法示例

    这篇文章主要为大家介绍了LeetCode百钱买百鸡题目python递归解法示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-11-11

最新评论