python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > Pandas中groupby+agg

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

作者:司徒轩宇

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

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

但它返回的结果结构是:

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

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

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

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

三、第二种写法: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

四、两种写法的核心区别对比

对比点第一种写法第二种写法
分组字段位置Index普通列
索引类型MultiIndex普通 Index
是否需要 reset_index
列名是否可控
扩展复杂统计不优雅非常自然
工程实用性较低很高

五、真实项目中的差距会越来越大

当统计需求升级,比如你还想算:

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

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

您可能感兴趣的文章:
阅读全文