如何仅填充pandas DataFrame中长度≤N的连续nan空缺
实现方案
你可以通过先识别连续NaN序列长度、再生成掩码过滤不符合要求的插值结果的方式实现需求,核心思路是先对全量数据做插值,再把连续NaN长度超过N的位置回退为原值NaN。
完整可运行代码
import pandas as pd import numpy as np # 构造示例数据 df = pd.DataFrame({ 'A': [1, np.nan, np.nan, np.nan, 5], 'B': [1, np.nan, np.nan, 4, 5], 'C': [1, 2, 3, np.nan, 5] }) # 设定最大可填充的连续NaN长度 N = 2 # 1. 先得到全量插值后的结果 df_full_interp = df.interpolate() # 2. 生成填充掩码:仅连续NaN长度≤N的位置允许被插值覆盖 fill_mask = df.isna() for col in df.columns: # 给每列的连续NaN打独立分组标签 is_nan_series = df[col].isna() nan_group_labels = is_nan_series.ne(is_nan_series.shift()).cumsum() # 仅筛选NaN所在的分组,计算每个分组的长度 nan_group_lengths = nan_group_labels[is_nan_series].map(nan_group_labels.value_counts()) # 把长度超过N的NaN分组对应的位置标记为不填充 fill_mask.loc[nan_group_lengths[nan_group_lengths > N].index, col] = False # 3. 应用掩码得到最终结果:符合条件的用插值值,不符合的保留原NaN df_result = df_full_interp.where(fill_mask, df) print(df_result)
输出结果
A B C 0 1.0 1.0 1.0 1 NaN 2.0 2.0 2 NaN 3.0 3.0 3 NaN 4.0 4.0 4 5.0 5.0 5.0
代码说明
- 用
isna().ne().cumsum()的方式给每列的连续NaN块分配唯一的分组标签,区分不同的连续NaN序列 - 计算每个连续NaN块的长度后,仅保留长度≤N的块作为允许插值的位置
- 最后通过
where方法把不符合条件的位置回退为原始NaN,避免全量插值覆盖长序列NaN
内容的提问来源于stack exchange,提问作者NeStack
相关产品推荐
相关产品推荐

