如何在Pandas中结合条件使用ffill和bfill填充缺失值?
条件填充空值:仅当前后非空值相等时填充
问题描述
输入DataFrame:
col A 100 B NaN C NaN D 100 E NaN F 103
期望输出:
col A 100 B 100 C 100 D 100 E NaN F 103
规则:仅当空值所在区间的前后非空值相等时,用该值填充中间的空值;若前后非空值不等,则空值保留。
解决方案
结合ffill()和bfill()做前后填充,再通过条件判断筛选符合要求的填充值:
import pandas as pd # 构造输入DataFrame df = pd.DataFrame({'col': [100, None, None, 100, None, 103]}, index=['A', 'B', 'C', 'D', 'E', 'F']) # 生成前向、后向填充的临时列 df['ffill_col'] = df['col'].ffill() df['bfill_col'] = df['col'].bfill() # 仅当前后填充值相等时替换原空值,否则保留原空值 df['col'] = df.apply(lambda row: row['ffill_col'] if row['ffill_col'] == row['bfill_col'] else row['col'], axis=1) # 删除临时列 df = df.drop(['ffill_col', 'bfill_col'], axis=1) print(df)
代码解释
- 构造输入:创建对应索引和值的DataFrame,用
None对应原问题中的NULL。 - 前后向填充:
ffill()获取每个位置的最近前向非空值,bfill()获取最近后向非空值。 - 条件筛选:逐行检查前后填充值,仅当二者相同时,用该值覆盖原空值;否则保持原空值不变。
- 清理临时数据:移除用于判断的临时列,得到最终结果。
运行结果
col A 100.0 B 100.0 C 100.0 D 100.0 E NaN F 103.0
内容的提问来源于stack exchange,提问作者Karthik Kini
相关产品推荐
相关产品推荐

