按组填充两个指定值之间缺失行的技术实现问题
问题描述
需要按group分组,填充每组中两个值为1的var1之间的缺失行。现有数据、期望结果var2和当前错误结果var3如下:
var1 group var2 var3 NaN 1 NaN NaN NaN 1 NaN NaN 1 1 1 1 NaN 1 1 1 NaN 1 1 1 1 1 1 1 NaN 1 NaN 1 NaN 1 NaN 1 1 2 1 1 NaN 2 1 1 1 2 1 1 NaN 2 NaN 1
当前使用的不符合预期的代码:
df.var3 = df.groupby('group')['var1'].bffill()
正确实现方法
原代码的bffill()会把所有后续NaN填充为最近的前向1,包括最后一个1之后的NaN,不符合需求。我们需要精准标记出每组内第一个1之前和最后一个1之后的区域,只填充中间区间的缺失值:
import pandas as pd def fill_between_ones(group): # 定位分组内所有var1为1的位置 has_one = group['var1'] == 1 if not has_one.any(): return group['var1'] # 无1的组直接返回原数据 # 获取第一个和最后一个1的索引 first_idx = has_one.idxmax() last_idx = has_one[::-1].idxmax() # 标记需要填充的区间 fill_mask = (group.index >= first_idx) & (group.index <= last_idx) # 区间内用双向填充确保所有缺失值被补为1,区间外保留原NaN group.loc[fill_mask, 'var2'] = group.loc[fill_mask, 'var1'].ffill().bfill() group.loc[~fill_mask, 'var2'] = group.loc[~fill_mask, 'var1'] return group['var2'] # 分组应用处理逻辑 df['var2'] = df.groupby('group').apply(fill_between_ones).reset_index(level=0, drop=True)
逻辑说明
- 对每个分组,先识别所有值为1的位置;
- 若分组内没有1,直接返回原数据;
- 锁定分组内第一个和最后一个1的索引范围,仅对该区间内的NaN做双向填充;
- 区间外的NaN保持原始状态,完全匹配期望的
var2结果。
内容的提问来源于stack exchange,提问作者MG Fern
相关产品推荐
相关产品推荐

