如何用ffill和bfill填充Pandas DataFrame中含NaN的列?
如何用ffill和bfill填充DataFrame中的NaN列?
核心概念
- ffill():全称forward fill,向前填充,用当前NaN的前一个非缺失值填充
- bfill():全称backward fill,向后填充,用当前NaN的后一个非缺失值填充
单独使用一种方法可能覆盖不全场景(比如列开头的NaN用ffill无法填充,列结尾的NaN用bfill无法填充),因此通常组合使用ffill().bfill(),先向前填充所有可填充的NaN,再向后补全剩余缺失值。
针对你的示例场景的解决方案
你的数据中ID列的缺失值与Expected分组强关联(A组对应ID=A,B组对应ID=B),必须分组后填充,避免跨组填充导致逻辑错误:
import pandas as pd import numpy as np # 构造示例数据 df = pd.DataFrame([ [np.nan, '2019-01-01', 'P', 'O', 'A'], [np.nan, '2019-01-02', 'O', 'O', 'A'], ['A', '2019-01-03', 'O', 'O', 'A'], ['A', '2019-01-04', 'O', 'P', 'A'], [np.nan, '2019-01-05', 'O', 'P', 'A'], [np.nan, '2019-01-01', 'P', 'O', 'B'], ['B', '2019-01-02', 'O', 'O', 'B'], ['B', '2019-01-03', 'O', 'O', 'B'], ['B', '2019-01-04', 'O', 'P', 'B'], [np.nan, '2019-01-05', 'O', 'P', 'B'], ], columns=['ID', 'Time', 'FromState', 'ToState', 'Expected']) # 按Expected分组,对每组ID列先向前填充再向后填充 df['ID'] = df.groupby('Expected')['ID'].transform(lambda x: x.ffill().bfill())
补充说明
- 如果数据无需分组(整列缺失值对应同一有效值),可直接对列操作:
# 直接填充整列的NaN df['ID'] = df['ID'].ffill().bfill()
transform方法会将分组内的填充结果映射回原DataFrame,保留原有索引和数据结构。
内容的提问来源于stack exchange,提问作者John Stud
相关产品推荐
相关产品推荐

