You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Python Pandas将各列末尾的NaN值填充为0?

Pandas用自定义值填充DataFrame列末尾NaN的最优方法

需求:用自定义值(如0)填充DataFrame中每列末尾连续的NaN,而Pandas原生的ffill方法只能用列内最后一个有效值填充,无法指定自定义值,示例如下:

输入DataFrame:

import pandas as pd
import numpy as np

df = pd.DataFrame([
    [np.nan, 1, 2, np.nan],
    [1, 4, 5, 2],
    [np.nan, 6, 7, np.nan],
    [np.nan, np.nan, 8, np.nan],
    [np.nan, np.nan, 8, np.nan]
])

期望输出:

0    1  2    3
0  NaN  1.0  2  NaN
1  1.0  4.0  5  2.0
2  0.0  6.0  7  0.0
3  0.0  0.0  8  0.0
4  0.0  0.0  8  0.0

解决方案

方法1:循环遍历列(直观易懂)

先获取每列最后一个非NaN值的索引,再将该索引之后的NaN替换为自定义值:

fill_val = 0

# 获取每列最后一个非NaN值的行索引
last_valid_idx = df.apply(pd.Series.last_valid_index)

# 逐列处理
for col, idx in last_valid_idx.items():
    if idx is not None:  # 跳过整列都是NaN的情况
        df.loc[idx+1:, col] = df.loc[idx+1:, col].fillna(fill_val)

方法2:向量化实现(高效无循环)

利用布尔矩阵标记需要填充的位置,通过mask方法批量替换,适合大数据集:

fill_val = 0

last_valid_idx = df.apply(pd.Series.last_valid_index)
# 生成布尔矩阵:标记每列中最后一个有效值之后的所有行
fill_mask = df.index.to_series().gt(last_valid_idx)
# 替换标记位置的NaN为自定义值
df = df.mask(fill_mask, fill_val)

两种方法都能得到符合预期的结果,其中向量化方法性能更优,适合处理大型DataFrame。

内容的提问来源于stack exchange,提问作者Tejas Krishna Reddy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 00:54:29