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]是1value[5:7]:对应行需填充为1,因为后1行内的value[7]是1value[11:14]:对应行需填充为1,因为后2行内的value[14]是1value[17:20]:对应行需填充为1,因为后2行内的value[20]是1value[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
相关产品推荐
相关产品推荐

