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

如何在Pandas中快速用指定序列填充非空行前后的NA值

Pandas高效填充非空值前后N行的序列值

可以利用Pandas结合NumPy的向量化操作替代循环,大幅提升处理效率,具体实现步骤如下:

  • 定位非空值的位置索引
    先提取Number列中非空行的索引:

    import pandas as pd
    import numpy as np
    
    # 构造示例数据集
    df = pd.DataFrame({
        'Time': [f't{i}' for i in range(10)],
        'Number': [np.nan, np.nan, np.nan, 0, np.nan, np.nan, np.nan, np.nan, 0, np.nan]
    })
    
    N = 2
    # 获取所有非空值的索引
    non_na_idx = df[df['Number'].notna()].index
    
  • 批量生成待填充的索引与对应值
    通过NumPy的广播特性,一次性生成所有需要填充的位置和对应序列值:

    # 生成需要的偏移序列:-N到N
    offsets = np.arange(-N, N+1)
    # 生成所有待填充的索引:每个非空索引加上所有偏移量
    fill_idx = non_na_idx[:, None] + offsets
    # 生成对应填充值:重复偏移序列,次数等于非空值的数量
    fill_values = np.tile(offsets, len(non_na_idx))
    
  • 过滤有效索引并完成赋值
    过滤掉超出DataFrame范围的无效索引,再批量赋值:

    # 筛选出在DataFrame索引范围内的有效位置
    valid_mask = (fill_idx >= 0) & (fill_idx < len(df))
    valid_fill_idx = fill_idx[valid_mask]
    valid_fill_values = fill_values[valid_mask]
    
    # 赋值到原数据集
    df.loc[valid_fill_idx, 'Number'] = valid_fill_values
    

执行后得到的结果如下:

TimeNumber
t0NaN
t1-2
t2-1
t30
t41
t52
t6-2
t7-1
t80
t91

这种基于向量化的方式完全避免了循环遍历,在处理大型数据集时效率远高于循环实现。

内容的提问来源于stack exchange,提问作者Lucio

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 23:15:45