如何用Pandas高效填充DataFrame最后一行的NaN值(取前序最近非空值)
Pandas:高效填充最后一行的NaN值(取列内最近非NaN值)
场景与原始数据
数据生成代码
import pandas as pd import numpy as np df = pd.DataFrame(np.random.randint(0, 10, (10, 10)), columns=list('ABCDEFGHIJ')) df[df > 5] = np.nan for i in range(10): df.iloc[i, i % 10] = np.nan
原始DataFrame
A B C D E F G H I J 0 NaN 2.0 NaN 0.0 5.0 4.0 1.0 NaN NaN 0.0 1 3.0 NaN NaN NaN 2.0 0.0 1.0 1.0 NaN 1.0 2 NaN 5.0 NaN 5.0 NaN 0.0 5.0 0.0 4.0 NaN 3 2.0 NaN NaN NaN 3.0 5.0 NaN NaN NaN 5.0 4 NaN 2.0 NaN 0.0 NaN NaN 2.0 NaN 2.0 0.0 5 NaN NaN NaN 2.0 NaN NaN NaN NaN 0.0 5.0 6 NaN NaN 0.0 NaN 2.0 NaN NaN 1.0 NaN NaN 7 NaN 5.0 1.0 2.0 4.0 NaN 3.0 NaN 3.0 2.0 8 1.0 5.0 1.0 NaN 3.0 NaN 1.0 NaN NaN 5.0 9 0.0 NaN NaN NaN 3.0 NaN 2.0 3.0 5.0 NaN
需求
仅对最后一行的NaN值进行填充,填充规则为取对应列中前序最近的非NaN值。由于DataFrame数据量较大,要求实现方式最节省内存、执行速度最快。
高效解决方案
利用Pandas内置的矢量化向前填充(ffill)功能,仅生成最后一行所需的填充值,避免全量修改DataFrame:
# 生成每列前序最近非NaN值的填充结果,仅提取最后一行 fill_values = df.ffill().iloc[-1] # 用对应值填充最后一行的NaN df.iloc[-1] = df.iloc[-1].fillna(fill_values)
方案优势
- 速度快:
ffill是Pandas底层优化的矢量化操作,比Python层面的循环、apply效率高几个数量级; - 内存省:仅生成最后一行的填充值,无需对整个DataFrame进行修改或复制;
- 精准性:仅修改最后一行的NaN值,完全保留其他行的原始数据。
最终结果
A B C D E F G H I J 0 NaN 2.0 NaN 0.0 5.0 4.0 1.0 NaN NaN 0.0 1 3.0 NaN NaN NaN 2.0 0.0 1.0 1.0 NaN 1.0 2 NaN 5.0 NaN 5.0 NaN 0.0 5.0 0.0 4.0 NaN 3 2.0 NaN NaN NaN 3.0 5.0 NaN NaN NaN 5.0 4 NaN 2.0 NaN 0.0 NaN NaN 2.0 NaN 2.0 0.0 5 NaN NaN NaN 2.0 NaN NaN NaN NaN 0.0 5.0 6 NaN NaN 0.0 NaN 2.0 NaN NaN 1.0 NaN NaN 7 NaN 5.0 1.0 2.0 4.0 NaN 3.0 NaN 3.0 2.0 8 1.0 5.0 1.0 NaN 3.0 NaN 1.0 NaN NaN 5.0 9 0.0 5.0 1.0 2.0 3.0 5.0 2.0 3.0 5.0 5.0
内容的提问来源于stack exchange,提问作者Zheng Xiaodong
相关产品推荐
相关产品推荐

