Pandas用Groupby分组均值替换'tbd'且不影响原有NaN值
解法
你可以直接在transform的匿名函数里用条件替换逻辑,仅针对值为'tbd'的项做填充,原有数值和NaN会完全保留:
直接使用replace的写法(符合你的需求)
import pandas as pd df['col_b'] = df.groupby(['col_a', 'col_c'])['col_b'].transform( lambda x: x.replace('tbd', x[x != 'tbd'].astype(float).round().mean()) )
逻辑说明
x[x != 'tbd']取出分组内所有非'tbd'的有效值计算均值,自动跳过'tbd'和原有NaN- 仅对值等于
'tbd'的项做替换,其他值(包括原有NaN)完全不修改 - 如果分组内不存在有效数值(全为
'tbd'),你可以额外加判断处理特殊场景,示例:
df['col_b'] = df.groupby(['col_a', 'col_c'])['col_b'].transform( lambda x: x.replace('tbd', x[x != 'tbd'].astype(float).round().mean()) if len(x[x != 'tbd']) >0 else x )
另一种更高效的where写法
也可以用where方法实现相同逻辑,性能略优于逐值replace:
df['col_b'] = df.groupby(['col_a', 'col_c'])['col_b'].transform( lambda x: x.where(x != 'tbd', pd.to_numeric(x, errors='coerce').round().mean()) )
内容的提问来源于stack exchange,提问作者Digital Moniker
相关产品推荐
相关产品推荐

