Python DataFrame分组后按ColD=Blue条件计算ColC均值生成ColE
解决方案:分组筛选特定行计算均值并填充新列
方法1:临时筛选列实现(直观易懂)
先构造一个仅保留ColD="Blue"对应ColC值、其余为NaN的临时列,再按分组计算均值(均值计算会自动忽略NaN),最后用transform把结果映射到每一行:
# 创建临时筛选列,仅保留ColD为Blue的ColC值 df['ColC_filtered'] = df['ColC'].where(df['ColD'] == 'Blue') # 分组计算均值并填充到ColE df['ColE'] = df.groupby(['ColA', 'ColB'])['ColC_filtered'].transform('mean') # 可选:删除临时列 df = df.drop(columns='ColC_filtered')
方法2:匿名函数直接筛选(简洁高效)
在transform中用匿名函数,针对每个分组的索引,筛选出ColD="Blue"的行再计算均值:
df['ColE'] = df.groupby(['ColA', 'ColB'])['ColC'].transform( lambda x: x[df.loc[x.index, 'ColD'] == 'Blue'].mean() )
最终结果表
| ColA | ColB | ColC | ColD | ColE |
|---|---|---|---|---|
| A | Type1 | 10 | Red | 20.0 |
| A | Type1 | 20 | Blue | 20.0 |
| A | Type2 | 10 | Blue | 20.0 |
| A | Type2 | 10 | Red | 20.0 |
| A | Type2 | 30 | Blue | 20.0 |
| B | Type1 | 70 | Blue | 70.0 |
| B | Type1 | 10 | Red | 70.0 |
| B | Type2 | 19 | Yellow | 32.5 |
| B | Type2 | 50 | Blue | 32.5 |
| B | Type2 | 12 | Yellow | 32.5 |
| B | Type2 | 15 | Blue | 32.5 |
说明
两种方法都能让每个ColA+ColB分组的所有行,统一填充该分组下ColD="Blue"的ColC均值;由于题目已确保每个分组至少有一行ColD="Blue",无需处理均值为NaN的情况。
内容的提问来源于stack exchange,提问作者Connie Xu
相关产品推荐
相关产品推荐

