如何使用pd.Series.ffill()仅对列中特定值执行前向填充
实现方案
可以实现该需求,无法直接调用pd.Series.ffill()单独完成,配合分组掩码限定填充范围即可实现,步骤如下:
1. 构造测试数据
import pandas as pd import numpy as np df = pd.DataFrame({ 'time': range(11), 'data': [1, 1, np.nan, np.nan, 6, np.nan, np.nan, np.nan, 5, 4, np.nan] })
2. 核心实现代码
s = df['data'].copy() # 按非空值拆分分组,每个分组对应一个非空值和后续的连续空值 group = s.notna().cumsum() # 判断每个分组的首值是否属于允许触发填充的范围(1或4) allow_fill_mask = s.groupby(group).transform('first').isin([1, 4]) # 仅对允许填充的分组执行前向填充,其余位置保留原值 df['data'] = s.where(~allow_fill_mask, s.ffill())
3. 输出结果验证
执行后df的输出与预期结果完全一致:
time data 0 0 1.0 1 1 1.0 2 2 1.0 3 3 1.0 4 4 6.0 5 5 NaN 6 6 NaN 7 7 NaN 8 8 5.0 9 9 4.0 10 10 4.0
实现逻辑说明
s.notna().cumsum()会对每一段「非空值+后续连续空值」分配唯一的分组编号,每个分组的第一个元素就是该段空值的前向参考值- 通过分组判断参考值是否为1或4,生成允许填充的掩码,仅在掩码为True的区域执行
ffill,其余区域保留原始空值即可
内容的提问来源于stack exchange,提问作者connor449
相关产品推荐
相关产品推荐

