如何用Pandas按name分组后基于cond条件计算分组均值并赋值新列
解决方案
方法一:先计算均值字典再映射
逻辑清晰、步骤明确的实现方式:
- 筛选出所有
cond=0的行,按name分组计算score的均值 - 将计算结果转为字典,通过
map方法把均值赋值给对应name的所有行
import pandas as pd # 构造原始DataFrame df = pd.DataFrame({ 'name': ['A', 'A', 'A', 'A', 'B', 'B', 'B', 'B'], 'score': [10, 5, 20, 30, 10, 20, 30, 40], 'cond': [0, 1, 2, 3, 0, 0, 4, 6] }) # 计算每个name对应的cond=0的score均值 avg_map = df[df['cond'] == 0].groupby('name')['score'].mean().to_dict() # 为所有行添加group_avg列 df['group_avg'] = df['name'].map(avg_map) print(df)
方法二:使用groupby+apply+reindex
通过分组后自定义逻辑计算均值,再将结果匹配到原DataFrame的每一行:
df['group_avg'] = df.groupby('name').apply( lambda group: group[group['cond'] == 0]['score'].mean() ).reindex(df['name']).values
结果验证
运行上述代码后,输出结果与要求完全一致:
name score cond group_avg 0 A 10 0 10.0 1 A 5 1 10.0 2 A 20 2 10.0 3 A 30 3 10.0 4 B 10 0 15.0 5 B 20 0 15.0 6 B 30 4 15.0 7 B 40 6 15.0
内容的提问来源于stack exchange,提问作者Charlie H.
相关产品推荐
相关产品推荐

