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

Pandas数据反向填充(bfill)需求:满足group为1且前2行内有1

带条件的反向填充(bfill)需求与实现

问题描述

给定如下DataFrame:

import pandas as pd
df = pd.DataFrame(
{ 
    "group":          [0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1,1, 1, 1, 1], 
    "value":          [0, 1, 1, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0,0, 0, 1, 1], 
    "desiredResult":  [0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0,0, 0, 1, 1], 
 })

需要基于以下两个条件对value列执行反向填充(bfill):

  • 仅在group列值为1的行中执行填充
  • 仅当当前行的后2行及以内存在value=1时,才对当前行执行反向填充(注:原描述中“前2行”应为笔误,结合示例逻辑修正为后2行)

示例说明

  • value[2:5]:对应行需填充为1,因为后2行内的value[5]是1
  • value[5:7]:对应行需填充为1,因为后1行内的value[7]是1
  • value[11:14]:对应行需填充为1,因为后2行内的value[14]是1
  • value[17:20]:对应行需填充为1,因为后2行内的value[20]是1
  • value[24:25]:无需填充,因为最近的1在3行以外

解决方案

以下代码可精准实现需求,核心是先标记符合条件的填充区域,再执行定向反向填充:

import pandas as pd

# 1. 筛选group=1的目标行
mask_group = df['group'] == 1

# 2. 标记后2行内存在value=1的行(含自身)
mask_ones = df['value'] == 1
mask_fill = mask_group & (
    mask_ones 
    | mask_ones.shift(-1).fillna(False) 
    | mask_ones.shift(-2).fillna(False)
)

# 3. 对标记区域执行反向填充,限制最大填充距离为2行
df['result'] = df['value'].where(~mask_fill, df['value'].bfill(limit=2))

# 验证结果是否符合预期
print(df[['value', 'desiredResult', 'result']])

代码说明

  • mask_group:锁定操作范围,避免干扰group=0的行
  • mask_fill:精准定位需要填充的行——既属于目标分组,又在某个value=1的前2行范围内
  • bfill(limit=2):限制反向填充的最大距离,防止过度填充超出需求范围

运行后result列将与desiredResult完全匹配。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 14:15:11