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

Pandas中按条件实现Status字段反向填充(backfill)的方法

问题描述

原始DataFrame结构如下:

Name    Date    Condition   Status
A   17-12-2021      
A   18-12-2022      
A   19-12-2023      
A   20-12-2023  0   Attack
A   21-12-2023      
A   22-12-2024      
B   17-12-2021      
B   18-12-2022      
B   19-12-2023      
B   20-12-2023  2   Sprain
B   21-12-2023      
B   22-12-2024      
C   18-12-2022      
C   19-12-2023      
C   20-12-2023  1   Nausea
C   21-12-2023      
C   22-12-2024  

建模假设状态在症状实际显现前已存在,需根据映射表dict_map = {0:2, 1:1, 2:2, 3:2, 4:2}按Condition值进行反向填充:Condition为0时向前填充2行,Condition为1时向前填充1行。直接使用bfill()会填充所有前置行,需实现条件化的反向填充,期望输出如下:

Name    Date    Condition   Status
A   17-12-2021      
A   18-12-2022      Attack
A   19-12-2023      Attack
A   20-12-2023  0   Attack
A   21-12-2023      
A   22-12-2024      
B   17-12-2021      
B   18-12-2022      Sprain
B   19-12-2023      Sprain
B   20-12-2023  2   Sprain
B   21-12-2023      
B   22-12-2024      
C   18-12-2022      
C   19-12-2023      Nausea
C   20-12-2023  1   Nausea
C   21-12-2023      
C   22-12-2024      
解决方案

可以通过分组+自定义填充逻辑实现条件化反向填充,步骤如下:

  1. 导入依赖并构造示例数据(已有DataFrame可跳过此步):
import pandas as pd

data = {
    'Name': ['A', 'A', 'A', 'A', 'A', 'A',
             'B', 'B', 'B', 'B', 'B', 'B',
             'C', 'C', 'C', 'C', 'C'],
    'Date': ['17-12-2021', '18-12-2022', '19-12-2023', '20-12-2023', '21-12-2023', '22-12-2024',
             '17-12-2021', '18-12-2022', '19-12-2023', '20-12-2023', '21-12-2023', '22-12-2024',
             '18-12-2022', '19-12-2023', '20-12-2023', '21-12-2023', '22-12-2024'],
    'Condition': [None, None, None, 0, None, None,
                  None, None, None, 2, None, None,
                  None, None, 1, None, None],
    'Status': ['', '', '', 'Attack', '', '',
               '', '', '', 'Sprain', '', '',
               '', '', 'Nausea', '', '']
}

df = pd.DataFrame(data)
  1. 定义自定义填充函数并分组处理:
dict_map = {0:2, 1:1, 2:2, 3:2, 4:2}

def conditional_backfill(group):
    # 获取组内Condition非空的行索引
    cond_rows = group[group['Condition'].notna()].index
    for idx in cond_rows:
        cond_val = group.loc[idx, 'Condition']
        # 根据映射表获取需要填充的行数
        fill_count = dict_map.get(cond_val, 0)
        # 计算填充起始索引,防止超出组的范围
        start_idx = max(group.index[0], idx - fill_count)
        # 填充指定区间的Status值
        group.loc[start_idx:idx-1, 'Status'] = group.loc[idx, 'Status']
    return group

# 按Name分组执行自定义填充
result_df = df.groupby('Name', group_keys=False).apply(conditional_backfill)

逻辑说明

  • 按Name分组:确保每个用户的填充操作独立,不会跨用户干扰
  • 定位Condition非空行:找到需要反向填充的起始锚点
  • 计算填充范围:根据映射表确定填充行数,同时限制起始索引不超出组内第一条记录,避免越界
  • 批量赋值:将锚点行的Status值赋值给指定区间的前置行

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 12:01:12