Pandas分组聚合:如何对指定前缀列分别计算求和与均值
解决DataFrame分组聚合的KeyError问题
错误原因
你之前的写法核心问题在于:agg() 接受的聚合字典,键必须是单个列名,而非列的元组或列表。你把多个FLAG_列打包成元组作为字典键,会被pandas识别为一个“以该元组命名的列”,自然找不到对应列,触发KeyError。
正确实现方式
方法1:构建标准聚合字典
先分别生成两类列的聚合规则,再合并为完整的聚合字典:
sum_cols = [col for col in df.columns if col.startswith('FLAG_')] mean_cols = [col for col in df.columns if col.startswith('RESPONSE_')] # 为每个列指定对应的聚合函数 agg_dict = {} agg_dict.update({col: 'sum' for col in sum_cols}) agg_dict.update({col: 'mean' for col in mean_cols}) # 执行分组聚合 df = df.groupby('ID').agg(agg_dict)
方法2:简洁的参数展开写法
利用Python字典解包,直接在agg()中传入两类列的聚合规则:
sum_cols = [col for col in df.columns if col.startswith('FLAG_')] mean_cols = [col for col in df.columns if col.startswith('RESPONSE_')] df = df.groupby('ID').agg( **{col: 'sum' for col in sum_cols}, **{col: 'mean' for col in mean_cols} )
方法3:链式分组聚合(适配流水线场景)
如果是数据流水线的一部分,可拆分聚合逻辑后合并结果,可读性和扩展性更强:
sum_cols = [col for col in df.columns if col.startswith('FLAG_')] mean_cols = [col for col in df.columns if col.startswith('RESPONSE_')] # 分别聚合两类列 sum_part = df.groupby('ID')[sum_cols].sum() mean_part = df.groupby('ID')[mean_cols].mean() # 合并结果 df = sum_part.join(mean_part)
内容的提问来源于stack exchange,提问作者rams
相关产品推荐
相关产品推荐

