Pandas中仅对连续NaN的最后一个值用前后有效值均值填充
Pandas指定规则NaN填充实现方案
填充规则
- 仅对连续NaN片段的最后一个值做填充,填充值为该位置前后相邻有效数值的均值
- 若为单个孤立NaN:该值本身就是片段最后一个值,直接用前后有效值均值填充
- 若为连续N个NaN(N≥2):仅填充片段内第N个(最后一个)NaN,其余N-1个NaN保留缺失状态
实现代码
import pandas as pd import numpy as np # 构造和示例输入一致的测试序列 s = pd.Series([1, np.nan, 3, np.nan, np.nan, 6, 7, np.nan, 9, np.nan, np.nan, np.nan, 13]) # 核心填充逻辑 # 1. 为连续NaN生成分组ID:同一段连续NaN会被分配相同的组号 na_group_id = s.notna().cumsum() # 2. 标记所有连续NaN片段的最后一个元素位置 is_last_na_pos = s.isna() & (s.groupby(na_group_id).cumcount(ascending=False) == 0) # 3. 计算每个位置对应的前后有效数值均值 fill_value = (s.ffill() + s.bfill()) / 2 # 4. 仅在标记位置执行填充,其余位置保留原值 result = s.mask(is_last_na_pos, fill_value)
效果验证
输入序列

0 1.0 1 NaN 2 3.0 3 NaN 4 NaN 5 6.0 6 7.0 7 NaN 8 9.0 9 NaN 10 NaN 11 NaN 12 13.0 dtype: float64
输出结果

0 1.0 1 2.0 2 3.0 3 NaN 4 4.5 5 6.0 6 7.0 7 8.0 8 9.0 9 NaN 10 NaN 11 11.0 12 13.0 dtype: float64
匹配校验
- 索引1为孤立NaN:填充前后值1、3的均值2,符合规则
- 索引3、4为连续2个NaN:仅最后一个位置(索引4)填充3、6的均值4.5,索引3保留NaN,符合规则
- 索引7为孤立NaN:填充前后值7、9的均值8,符合规则
- 索引9、10、11为连续3个NaN:仅最后一个位置(索引11)填充9、13的均值11,前两个位置保留NaN,和期望效果完全一致
内容的提问来源于stack exchange,提问作者Subhojyoti Lahiri
相关产品推荐
相关产品推荐

