如何用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
相关产品推荐
相关产品推荐

