You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Pandas实现类似SQL的多列分组多指标聚合?

Pandas多列分组聚合的正确实现方式

你的问题出在原代码的链式调用写法上——当你执行df.groupby(...)['points'].mean()后,得到的已经是一个以分组键为索引的Series,这时候再去索引['counts'],pandas会以为你要找这个Series索引里的'counts'值,自然会触发KeyError,因为分组键里根本没有这个列名。

要实现类似SQL的多列聚合,正确的做法是用groupby后的agg()方法,通过字典明确指定每一列对应的聚合操作,这样pandas会一次性完成所有列的聚合计算。下面给你两种常用的实现方式:

方式1:自定义聚合结果列名(推荐)

如果你想给聚合后的列起更清晰的名字(比如区分原列和聚合操作),可以用(列名, 聚合函数)的形式指定:

# 一次性完成所有列的聚合
df_agg = df.groupby(['House', 'cat1', 'cat2', 'cat3']).agg(
    points_mean=('points', 'mean'),    # 对points列取均值,结果列名为points_mean
    counts_count=('counts', 'count'),  # 对counts列计数,结果列名为counts_count
    value_sum=('value', 'sum'),        # 对value列求和
    metric_sum=('metric', 'sum'),
    metric2_sum=('metric2', 'sum'),
    metric3_sum=('metric3', 'sum')
).reset_index()  # 将分组键从索引转为普通列

方式2:保留原列名的聚合

如果不需要重命名列,直接用字典映射原列名到对应的聚合函数即可:

# 定义聚合规则字典
agg_rules = {
    'points': 'mean',
    'counts': 'count',
    'value': 'sum',
    'metric': 'sum',
    'metric2': 'sum',
    'metric3': 'sum'
}

# 执行聚合
df_agg = df.groupby(['House', 'cat1', 'cat2', 'cat3']).agg(agg_rules).reset_index()

这两种方式都能避免你遇到的KeyError问题,而且完全对应SQL中GROUP BY ... SELECT AVG(points), COUNT(counts), SUM(value)...的逻辑。

内容的提问来源于stack exchange,提问作者mitch

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 06:36:07