求助:Python循环结合GroupBy为多列创建均值衍生列
问题分析与解决方案
原代码的问题
- 列筛选条件错误:你定义的
collist = ['avg_'],但目标列的前缀是avg(如avg_jump)而非avg_,导致df.filter(like='avg_')匹配不到任何列,后续逻辑完全不执行。 - 赋值逻辑错误:即便匹配到多列
avgcols,df[f'{col}_2']试图将多列的transform结果(DataFrame类型)赋值给单个列,会引发维度不匹配的报错。
正确实现方法
方法一:批量处理(更高效)
直接筛选所有以avg开头的列,分组计算均值后重命名列,再合并回原DataFrame:
import pandas as pd import numpy as np # 构造示例数据 data = { 'rater_id': [100,100,101,101,102,103], 'being_rated_id': [200,200,200,200,201,202], 'combine_id': ['100200','100200','101200','101200','102201','103202'], 'avg_jump': [3,4,1,2,3,4], 'avg_run': [3,4,1,3,2,4], 'avg_swim': [2,1,2,2,3,4], 'category': ['heats','heats','finals','finals','heats','finals'] } df = pd.DataFrame(data) # 筛选所有以avg开头的列 avg_cols = df.columns[df.columns.str.startswith('avg')] # 分组计算均值,并重命名列添加_2后缀 grouped_means = df.groupby(['combine_id','category'])[avg_cols].transform(np.mean) grouped_means.columns = [f'{col}_2' for col in grouped_means.columns] # 合并回原DataFrame df = pd.concat([df, grouped_means], axis=1) # 可选:去掉avg_swim列以匹配你的预期输出 df = df.drop('avg_swim', axis=1) print(df)
方法二:循环遍历单个列
如果需要逐个处理每一列,可使用以下写法:
import pandas as pd import numpy as np # 构造示例数据(同上) data = { 'rater_id': [100,100,101,101,102,103], 'being_rated_id': [200,200,200,200,201,202], 'combine_id': ['100200','100200','101200','101200','102201','103202'], 'avg_jump': [3,4,1,2,3,4], 'avg_run': [3,4,1,3,2,4], 'avg_swim': [2,1,2,2,3,4], 'category': ['heats','heats','finals','finals','heats','finals'] } df = pd.DataFrame(data) # 遍历所有以avg开头的列 for col in df.columns[df.columns.str.startswith('avg')]: # 计算分组均值并添加新列 df[f'{col}_2'] = df.groupby(['combine_id','category'])[col].transform(np.mean) # 可选:去掉avg_swim列 df = df.drop('avg_swim', axis=1) print(df)
输出结果
两种方法都会生成符合预期的结果:
rater_id being_rated_id combine_id avg_jump avg_run category avg_jump_2 avg_run_2 0 100 200 100200 3 3 heats 3.5 3.5 1 100 200 100200 4 4 heats 3.5 3.5 2 101 200 101200 1 1 finals 1.5 2.0 3 101 200 101200 2 3 finals 1.5 2.0 4 102 201 102201 3 2 heats 3.0 2.0 5 103 202 103202 4 4 finals 4.0 4.0
内容的提问来源于stack exchange,提问作者wjie08
相关产品推荐
相关产品推荐

