如何用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
相关产品推荐
相关产品推荐

