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 内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 浅谈python socket函数中,send与sendall的区别与使用方法

    浅谈python socket函数中,send与sendall的区别与使用方法

    下面小编就为大家带来一篇浅谈python socket函数中,send与sendall的区别与使用方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-05-05
  • python定时检查启动某个exe程序适合检测exe是否挂了

    python定时检查启动某个exe程序适合检测exe是否挂了

    定时检查启动某个exe程序这种情况下适合检测某个exe程序是否挂了,感兴趣的朋友可以了解下,希望本文对你有所帮助
    2013-01-01
  • Python实现的本地文件搜索功能示例【测试可用】

    Python实现的本地文件搜索功能示例【测试可用】

    这篇文章主要介绍了Python实现的本地文件搜索功能,涉及Python针对文件与目录的遍历、判断、编码转换、查找等相关操作技巧,需要的朋友可以参考下
    2018-05-05
  • 基于Python编写复杂密码图形化生成工具

    基于Python编写复杂密码图形化生成工具

    这篇文章主要为大家详细介绍了如何基于Python编写复杂密码图形化生成工具,支持选择生成10位和12位复杂密码,需要的小伙伴可以参考一下
    2024-04-04
  • 使用python实现数组、链表、队列、栈的方法

    使用python实现数组、链表、队列、栈的方法

    数据结构是指相互之间存在着一种或多种关系的数据元素的集合和该集合中数据元素之间的关系组成。这篇文章主要介绍了使用python实现数组、链表、队列、栈的相关知识,需要的朋友可以参考下
    2019-12-12
  • Python中循环引用(import)失败的解决方法

    Python中循环引用(import)失败的解决方法

    在python中常常会遇到循环import即circular import的问题,下面这篇文章主要给大家介绍了关于Python中循环引用(import)失败的解决方法,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面来一起学习学习吧。
    2018-04-04
  • python+tkinter实现一个简单的秒钟

    python+tkinter实现一个简单的秒钟

    这篇文章主要为大家详细介绍了Python如何利用tkinter实现一个简单的秒钟,文中的示例代码讲解详细,具有一定的参考价值,感兴趣的小伙伴可以自己动手尝试一下
    2024-02-02
  • 利用Python代码实现模拟动态指针时钟

    利用Python代码实现模拟动态指针时钟

    这篇文章主要为大家详细介绍了如何利用python和C++代码实现模拟动态指针时钟,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起了解一下
    2023-04-04
  • python定向爬取淘宝商品价格

    python定向爬取淘宝商品价格

    这篇文章主要为大家详细介绍了python定向爬取淘宝商品价格,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-02-02
  • Python文件处理与垃圾回收机制详情

    Python文件处理与垃圾回收机制详情

    这篇文章主要介绍了Python文件处理与垃圾回收机制详情,文件是操作系统提供给用户应用程序操作硬盘的一个虚拟的概念接口,需要的朋友可以参考下面文章内容
    2022-09-09

最新评论