当前位置: 首页 > news >正文

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

注意事项

  1. 首行 NaN 处理
    如果首行有 NaNffill 无法填充(前面没有数据),需结合 bfill 或手动处理。

  2. 原地修改
    若需直接修改原 DataFrame,使用 inplace=True(不推荐,建议赋值新变量):

    df.fillna(method='ffill', inplace=True)  # 直接修改原数据
    
  3. 性能优化
    对大型数据集,优先使用向量化操作(如 fillna),避免逐行循环。


总结

通过 df.fillna(method='ffill') 可以高效实现 用前一个有效值填充 NaN,适用于时间序列、传感器数据等场景。根据需求可调整 axislimit 等参数灵活控制填充逻辑。

相关文章:

  • 蓝桥杯备考:动态规划路径类dp之迷雾森林
  • ubuntu 20.04下ZEDmini安装使用
  • 【 <一> 炼丹初探:JavaWeb 的起源与基础】之 JSP 中的内置对象:request、response、session 的使用示例
  • C++11新特性:auto遇上const时的推导规则
  • blender看不到导入的模型
  • YOLOv12本地部署教程——42%速度提升,让高效目标检测触手可及
  • 要查看 SQLite 数据库中的所有表,可以通过查询 SQLite 的系统表 sqlite_master
  • 从0到1搭建315答题抽奖小程序:技术踩坑与运营真相
  • 【Vue CLI脚手架开发】——6.scoped样式
  • javascript字符串截取有哪些
  • RabbitMQ知识点
  • 二叉树-验证二叉搜索树
  • 计算机网络开发(2)TCP\UDP区别、TCP通信框架、服务端客户端通信实例
  • RV1126采集VI视频数据流
  • 【QWEN】机器人控制器的控制周期越短精度越高吗
  • Kotlin D1
  • 模块15.常用API
  • Java接口(3)与图书管理系统
  • Android 多用户相关
  • tcp/ip协议详细介绍,tcpip协议详细介绍
  • wordpress 网站加密/什么是长尾关键词举例
  • wordpress文章复制的图片/长沙优化排名
  • 做网站需要icp吗/武汉seo结算
  • wap网站 开发/房产网站建设
  • 东莞市建网站/精准营销系统
  • 宝鸡网站建设哪家好/房地产销售工作内容