如何在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
执行后得到的结果如下:
| Time | Number |
|---|---|
| t0 | NaN |
| t1 | -2 |
| t2 | -1 |
| t3 | 0 |
| t4 | 1 |
| t5 | 2 |
| t6 | -2 |
| t7 | -1 |
| t8 | 0 |
| t9 | 1 |
这种基于向量化的方式完全避免了循环遍历,在处理大型数据集时效率远高于循环实现。
内容的提问来源于stack exchange,提问作者Lucio
相关产品推荐
相关产品推荐

