【Pandas】pandas DataFrame ffill

Pandas2.2 DataFrame

Missing data handling

方法 描述
DataFrame.fillna([value, method, axis, ...]) 用于填充 DataFrame 中的缺失值(NaN)
DataFrame.backfill(*[, axis, inplace, ...]) 用于**使用后向填充(即"下一个有效观测值")来填补缺失值(NaN)**的方法
DataFrame.bfill(*[, axis, inplace, limit, ...]) 用于**使用后向填充(即"下一个有效观测值")来填补缺失值(NaN)**的方法
DataFrame.dropna(*[, axis, how, thresh, ...]) 用于删除包含缺失值(NaN)的行或列的方法
DataFrame.ffill(*[, axis, inplace, limit, ...]) 用于**使用前向填充(即"前一个有效观测值")来填补缺失值(NaN)**的方法

pandas.DataFrame.ffill()

pandas.DataFrame.ffill() 是一个用于**使用前向填充(即"前一个有效观测值")来填补缺失值(NaN)**的方法。它等价于 fillna(method='ffill'),常用于时间序列、传感器数据或需要保持趋势一致性的场景。


📌 方法签名
python 复制代码
DataFrame.ffill(*, axis=None, inplace=False, limit=None, limit_area=None, downcast=<no_default>)

🔧 参数说明
参数 类型 说明
axis {0/'index', 1/'columns'},默认为 None 指定填充方向: - 0'index':按行方向(向下)填充 - 1'columns':按列方向(向右)填充
inplace bool,默认 False 是否在原对象上修改
limit int,可选 最多连续填充的 NaN 数量;若未指定,则全部填充
limit_area 'inside''outside',可选 控制填充区域: - 'inside':仅填充被非空包围的 NaN 区域 - 'outside':填充边缘的 NaN
downcast dict'infer',可选 控制是否尝试将结果转换为更小的数据类型(如 float64 → float32)

✅ 返回值
  • 返回一个新的 DataFrame,其中的 NaN 值被前向填充;
  • 如果 inplace=True,则返回 None,原始数据被修改。

🧪 示例代码及结果
示例 1:基本用法 - 行方向前向填充(axis=0)
python 复制代码
import pandas as pd
import numpy as np

df = pd.DataFrame({
    'A': [1, np.nan, 3, np.nan, 5],
    'B': [np.nan, 2, np.nan, 4, np.nan]
})

print("Original DataFrame:")
print(df)

# 使用 ffill 按行方向填充
df_ffilled = df.ffill()
print("\nAfter ffill():")
print(df_ffilled)
输出结果:
复制代码
Original DataFrame:
     A    B
0  1.0  NaN
1  NaN  2.0
2  3.0  NaN
3  NaN  4.0
4  5.0  NaN

After ffill():
     A    B
0  1.0  NaN
1  1.0  2.0
2  3.0  2.0
3  3.0  4.0
4  5.0  4.0

注意第一行 B 列仍为 NaN,因为前面没有有效值可用。


示例 2:限制最大填充数量(limit=1)
python 复制代码
# 设置最多填充 1 个连续 NaN
df_limited = df.ffill(limit=1)
print("\nAfter ffill(limit=1):")
print(df_limited)
输出结果:
复制代码
After ffill(limit=1):
     A    B
0  1.0  NaN
1  1.0  2.0
2  NaN  2.0
3  NaN  4.0
4  NaN  4.0

可见每列最多只向前填充一个 NaN。


示例 3:按列方向填充(axis=1)
python 复制代码
# 创建按列方向有 NaN 的 DataFrame
df_col = pd.DataFrame({
    'X': [1, 2, 3],
    'Y': [np.nan, 5, 6],
    'Z': [7, np.nan, 9]
})

print("Original Column-wise DataFrame:")
print(df_col)

# 按列方向填充
df_col_ffilled = df_col.ffill(axis=1)
print("\nAfter ffill(axis=1):")
print(df_col_ffilled)
输出结果:
复制代码
Original Column-wise DataFrame:
   X    Y    Z
0  1  NaN  7.0
1  2  5.0  NaN
2  3  6.0  9.0

After ffill(axis=1):
   X    Y    Z
0  1  1.0  7.0
1  2  5.0  5.0
2  3  6.0  6.0

第二列 Y 被前一列 X 填充,第三列 Z 被第二列填充。


示例 4:使用 limit_area='inside' 仅填充内部 NaN
python 复制代码
# 构造包含边界和内部 NaN 的 DataFrame
df_limit_area = pd.DataFrame({
    'A': [np.nan, 2, np.nan, 4, np.nan],  # 边缘 NaN
    'B': [1, np.nan, 3, np.nan, 5]        # 内部 NaN
})

print("Original DataFrame with edge and internal NaNs:")
print(df_limit_area)

# 只填充被非空包围的 NaN(不填充边缘)
df_inside = df_limit_area.ffill(limit_area='inside')
print("\nAfter ffill(limit_area='inside'):")
print(df_inside)
输出结果:
复制代码
Original DataFrame with edge and internal NaNs:
     A    B
0  NaN  1.0
1  2.0  NaN
2  NaN  3.0
3  4.0  NaN
4  NaN  5.0

After ffill(limit_area='inside'):
     A    B
0  NaN  1.0
1  2.0  1.0
2  NaN  3.0
3  4.0  3.0
4  NaN  5.0

只填充了中间的 NaN,首尾的未填充。


示例 5:使用 limit_area='outside' 仅填充边缘 NaN
python 复制代码
# 仅填充边缘 NaN
df_outside = df_limit_area.ffill(limit_area='outside')
print("\nAfter ffill(limit_area='outside'):")
print(df_outside)
输出结果:
复制代码
After ffill(limit_area='outside'):
     A    B
0  NaN  1.0
1  2.0  NaN
2  2.0  3.0
3  4.0  NaN
4  4.0  5.0

此时只填充了最前或最后的 NaN,中间的未填充。


示例 6:原地修改(inplace=True)
python 复制代码
# 原地修改
df.ffill(inplace=True)
print("\nIn-place ffill (modified original):")
print(df)
输出结果(基于示例 1 的数据):
复制代码
In-place ffill (modified original):
     A    B
0  1.0  NaN
1  1.0  2.0
2  3.0  2.0
3  3.0  4.0
4  5.0  4.0

🧠 应用场景
  • 时间序列数据处理:填补缺失的时间点数据;
  • 传感器或日志数据清洗:使用前一个时刻的值进行插值;
  • 数据预处理:准备模型输入前去除 NaN;
  • 控制填充范围 :通过 limit_area 精确控制填充哪些位置;
  • 链式调用中清理数据 :如 df.dropna().ffill()

⚠️ 注意事项
  • 默认按行方向(axis=0)填充;
  • 支持 limit_area,这是 fillna(method='ffill') 所没有的功能;
  • 若无前一个有效值,则无法填充;
  • limit 控制连续填充的最大数量;
  • 不会自动排序索引,建议先排序以获得预期效果;
  • 推荐结合 fillna()bfill() 等方法一起使用以满足不同需求;
  • 仅对 NaN 生效,不会处理 None 或其他空值。

✅ 总结对比
方法 是否支持 limit_area 是否推荐使用
ffill() ✅ 是 ✅ 推荐
pad() ✅ 是(与 ffill() 完全相同) ✅ 推荐
fillna(method='ffill') ✅ 是(通过 method ✅ 推荐(更通用)

你可以根据具体需求选择最适合的参数组合来清理缺失值。

相关推荐
CodeCraft Studio2 天前
Excel处理控件Aspose.Cells教程:使用 Python 将 Pandas DataFrame 转换为 Excel
python·json·excel·pandas·csv·aspose·dataframe
njxiejing2 天前
Pandas数据结构(DataFrame,字典赋值)
数据结构·人工智能·pandas
Calihen的学习日志3 天前
【Pandas】3.1-数据预处理:列的基本操作
python·pandas
Source.Liu4 天前
【Python自动化】 21.2 Pandas 读取 Excel 时的 dtype 参数完全指南
python·自动化·pandas
Source.Liu4 天前
【Python自动化】 21 Pandas Excel 操作完整指南
python·excel·pandas
Source.Liu4 天前
【Python自动化】 21.1 Pandas 读取 Excel 文件的完整指南
python·自动化·pandas
偷心伊普西隆5 天前
Pandas DataFrame 指南
python·数据分析·pandas
chad__chang11 天前
Pandas的数据结构
数据结构·pandas
老歌老听老掉牙13 天前
Pandas DataFrame 列数操作完全指南
python·pandas
万粉变现经纪人14 天前
如何解决pip安装报错ModuleNotFoundError: No module named ‘websockets’问题
ide·pycharm·beautifulsoup·pandas·fastapi·pip·httpx