
本文介绍如何利用 Pandas 的 fillna() 与 bfill() 协同操作,将一列中的缺失值(NaN)替换为另一列中首个非空向下可见的有效值,精准实现跨列逻辑填充。
本文介绍如何利用 pandas 的 `fillna()` 与 `bfill()` 协同操作,将一列中的缺失值(nan)替换为另一列中**首个非空向下可见的有效值**,精准实现跨列逻辑填充。
在数据清洗过程中,常需根据关联列的上下文信息填充缺失值,而非简单用固定值或均值替代。本例需求明确:对 Column_2 中的每个 NaN,应填入 Column_1 中该位置之后(含自身)第一个非空值——即“向下找最近的有效值”,这本质上是 Column_1 的反向填充(back-fill)结果。
正确解法是组合使用 Series.fillna() 与 Series.bfill():
-
df['Column_1'].bfill()从下往上填充Column_1的 NaN,使每个位置都携带其下方(含自身)首个有效值; - 再用该序列作为
fillna()的参数,即可将Column_2中所有 NaN 替换为对应行的Column_1向下可见首值。
import pandas as pd
import numpy as np
# 构造示例数据
df = pd.DataFrame({
'Column_1': ['F', np.nan, np.nan, 'G', np.nan, np.nan, 'H'],
'Column_2': ['A', 'B', np.nan, 'C', np.nan, 'D', 'D']
})
# 核心操作:用 Column_1 的反向填充结果填充 Column_2 的空值
df['Column_2'] = df['Column_2'].fillna(df['Column_1'].bfill())
print(df)输出结果完全匹配预期:
Column_1 Column_2 0 F A 1 NaN B 2 NaN G 3 G C 4 NaN H 5 NaN D 6 H D
⚠️ 注意事项:
- 原始代码
df['Colunmn_2'].ffill(...)错误在于混淆了方法用途:ffill()是前向填充(用上方值覆盖下方 NaN),而本例需要的是“按另一列的向下可见值填充”,必须用bfill()预处理参考列; - 列名拼写需严格一致(如原文中
Colunmn_2应为Column_2),否则触发KeyError; - 若
Column_1底部存在连续 NaN,bfill()将仍保留顶部 NaN,此时fillna()无法填补——建议提前检查Column_1.isna().all()或设置limit参数控制填充范围。
此方法简洁、向量化、无需循环,是 Pandas 中跨列条件填充的典型高效实践。

















