如何简化Pandas多列分组聚合(sum/count)的代码编写
Pandas分组聚合简化实现方案
需求说明
对以下Pandas DataFrame按H1、H2列分组聚合:
V1、V2、V3列执行sum求和操作V4、V5、V6、V7、V8列执行count计数操作
DataFrame定义代码:
import pandas as pd df_p = pd.DataFrame({'H1':['A1','A1','C1','B1','A1','C1'], 'H2':['X1','Y1','Z1','X1','Y1','Z1'], 'V1':[1,2,3,4,5,6], 'V2':[10,20,30,40,50,60], 'V3':[100,200,300,400,500,600], 'V4':[1000,2000,3000,4000,5000,6000], 'V5':[11,12,13,14,15,16], 'V6':[110,120,130,140,150,160], 'V7':[1100,1200,1300,1400,1500,1600], 'V8':[1100,1200,1300,1400,1500,1600],})
常见问题
直接使用列表作为聚合字典的键会触发语法错误,如下写法无效:
# 错误写法:字典键不能为列表 df_p.groupby(['H1','H2']).agg({['V1','V2','V3']:'sum',['V4','V5','V6','V7','V8']:'count'})
逐个列指定聚合函数的写法可行,但列数较多时操作繁琐:
# 可行但繁琐的写法 df_p.groupby(['H1','H2']).agg({'V1':'sum','V2':'sum','V3':'sum','V4':'count','V5':'count','V6':'count','V7':'count','V8':'count'})
简化实现方案
通过列分组+字典推导式快速构建聚合规则字典,只需维护两个列列表即可,适合大量列的场景:
方法1:字典推导式合并
# 定义需要聚合的列组 sum_cols = ['V1', 'V2', 'V3'] count_cols = ['V4', 'V5', 'V6', 'V7', 'V8'] # 构建聚合字典 agg_dict = {col: 'sum' for col in sum_cols} | {col: 'count' for col in count_cols} # 执行分组聚合 result = df_p.groupby(['H1', 'H2']).agg(agg_dict)
方法2:字典update方法
如果使用Python版本低于3.9(不支持|字典合并运算符),可以用update方法:
sum_cols = ['V1', 'V2', 'V3'] count_cols = ['V4', 'V5', 'V6', 'V7', 'V8'] agg_dict = {} agg_dict.update({col: 'sum' for col in sum_cols}) agg_dict.update({col: 'count' for col in count_cols}) result = df_p.groupby(['H1', 'H2']).agg(agg_dict)
方法3:动态列筛选(可选)
如果列名有规律(比如前缀一致),还可以通过列名筛选自动生成列组,进一步简化:
# 自动筛选目标列(示例,根据实际列名规律调整) sum_cols = [col for col in df_p.columns if col in ['V1','V2','V3']] count_cols = [col for col in df_p.columns if col.startswith('V') and int(col[1:]) >=4] agg_dict = {col: 'sum' for col in sum_cols} | {col: 'count' for col in count_cols} result = df_p.groupby(['H1', 'H2']).agg(agg_dict)
内容的提问来源于stack exchange,提问作者Rajib Lochan Sarkar
相关产品推荐
相关产品推荐

