dataframe能否把列表里所有的NaN换成列表上一位的数字?
在 Pandas 中,可以使用 fillna(method='ffill')
方法将 DataFrame 中的 NaN
替换为前一个有效值(即 前向填充)。以下是具体实现方法:
基础实现
import pandas as pd
import numpy as np
# 示例 DataFrame
df = pd.DataFrame({
"列名1": [1, np.nan, np.nan, 4],
"列名2": [np.nan, 2, np.nan, 5]
})
# 前向填充所有 NaN
df_filled = df.fillna(method='ffill') # method='ffill' 表示用前一个有效值填充
print("原始数据:\n", df)
print("\n填充后:\n", df_filled)
输出结果:
原始数据:
列名1 列名2
0 1.0 NaN
1 NaN 2.0
2 NaN NaN
3 4.0 5.0
填充后:
列名1 列名2
0 1.0 NaN # 第一个 NaN 无法填充(前面没有值)
1 1.0 2.0
2 1.0 2.0 # 继承前一个有效值
3 4.0 5.0
进阶用法
1. 限定填充方向(行/列)
默认按列方向填充 (axis=0
),也可按行填充 (axis=1
):
# 按行前向填充(横向填充)
df_filled_row = df.fillna(method='ffill', axis=1)
2. 结合后向填充
若需要同时填充首部的 NaN
,可以组合使用 bfill
(后向填充):
# 先前向填充,再后向填充
df_filled = df.fillna(method='ffill').fillna(method='bfill')
3. 限定填充步数
通过 limit
参数限制连续填充的最大次数:
# 每个 NaN 最多被填充一次(仅填充紧跟其后的一个 NaN)
df_limited = df.fillna(method='ffill', limit=1)
完整代码示例
import pandas as pd
import numpy as np
# 创建含 NaN 的 DataFrame
data = {
"A": [1, np.nan, np.nan, 4, np.nan],
"B": [np.nan, 2, np.nan, 5, 6]
}
df = pd.DataFrame(data)
# 前向填充所有列
df_filled = df.fillna(method='ffill')
# 显示结果
print("原始数据:\n", df)
print("\n前向填充后:\n", df_filled)
输出结果:
原始数据:
A B
0 1.0 NaN
1 NaN 2.0
2 NaN NaN
3 4.0 5.0
4 NaN 6.0
前向填充后:
A B
0 1.0 NaN # B 列第一个 NaN 无法填充
1 1.0 2.0
2 1.0 2.0 # A 和 B 继承前值
3 4.0 5.0
4 4.0 6.0 # A 列继承前值 4
注意事项
-
首行 NaN 处理
如果首行有NaN
,ffill
无法填充(前面没有数据),需结合bfill
或手动处理。 -
原地修改
若需直接修改原 DataFrame,使用inplace=True
(不推荐,建议赋值新变量):df.fillna(method='ffill', inplace=True) # 直接修改原数据
-
性能优化
对大型数据集,优先使用向量化操作(如fillna
),避免逐行循环。
总结
通过 df.fillna(method='ffill')
可以高效实现 用前一个有效值填充 NaN,适用于时间序列、传感器数据等场景。根据需求可调整 axis
、limit
等参数灵活控制填充逻辑。