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
解决方案
可以通过分组+自定义填充逻辑实现条件化反向填充,步骤如下:
- 导入依赖并构造示例数据(已有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)
- 定义自定义填充函数并分组处理:
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
相关产品推荐
相关产品推荐

