You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

按组填充两个指定值之间缺失行的技术实现问题

问题描述

需要按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的位置;
  2. 若分组内没有1,直接返回原数据;
  3. 锁定分组内第一个和最后一个1的索引范围,仅对该区间内的NaN做双向填充;
  4. 区间外的NaN保持原始状态,完全匹配期望的var2结果。

内容的提问来源于stack exchange,提问作者MG Fern

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 09:25:37