pandas如何仅对Y列值为1的行的Z列NaN值执行bfill后向填充
实现方法
核心思路是先得到整列Z后向填充的结果,再仅将Y值为1的行的Z列替换为填充后的值,其余行保持原始数据不变,且后向填充的规则和全列填充完全一致,不会出现筛选后行顺序错乱导致的填充错误。
代码实现
写法1(易读版,带临时列)
- 生成全列后向填充的临时结果
df['Z_temp_bfill'] = df['Z'].bfill()
- 仅更新Y值为1的行的Z列数据
df.loc[df['Y'] == 1, 'Z'] = df.loc[df['Y'] == 1, 'Z_temp_bfill']
- 删除临时列(不需要保留中间结果的话执行即可)
df.drop(columns=['Z_temp_bfill'], inplace=True)
写法2(精简版,无临时列)
可以把逻辑合并为一行,无需生成额外的辅助列:
df.loc[df['Y'] == 1, 'Z'] = df['Z'].bfill().loc[df['Y'] == 1]
说明:pandas的
bfill()方法默认仅修改NaN值,非空的原始单元格不会被覆盖,符合你只填充缺失值的需求。
如果你需要仅在Y=1的行范围内做后向填充(即填充时不会用Y≠1的行的Z值作为填充来源),可以用以下写法:df.loc[df['Y'] == 1, 'Z'] = df.loc[df['Y'] == 1, 'Z'].bfill()
内容的提问来源于stack exchange,提问作者Trigger Happy
相关产品推荐
相关产品推荐

