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 ) |
✅ 推荐(更通用) |
你可以根据具体需求选择最适合的参数组合来清理缺失值。