Pandas按ID分组依据日期条件更新DataFrame的Status列
Pandas分组更新状态实现方案
核心思路
- 先将
Origin字段转为整数类型,避免字符串比较导致的逻辑错误 - 按
ID分组,计算每个分组内Origin的最大值(即组内最新年份) - 筛选出满足「状态为
Unfinished且Origin不是组内最大值」的行,为其标记更新后的状态,其余行不做修改
完整实现代码
import pandas as pd # 示例数据构造(已有数据集可跳过此段) df = pd.DataFrame({'ID': ['1', '1', '1', '2', '2', '2'], 'ID2': ['25', '29', '56', '562', '92', '170'], 'Origin': ['2005', '2010', '2020', '1995', '1999', '2007'], 'Status' : ['Done', 'Unfinished', 'Done', 'Done', 'Done', 'Unfinished'] }) # 类型转换:将年份从字符串转为整数 df['Origin'] = df['Origin'].astype(int) # 分组计算每个ID对应的最新年份(Origin最大值),用transform把值映射回每一行 df['group_max_origin'] = df.groupby('ID')['Origin'].transform('max') # 生成Updated_Status列 df['Updated_Status'] = '' # 构造更新掩码:状态为未完成,且所在行不是组内最新年份 update_condition = (df['Status'] == 'Unfinished') & (df['Origin'] != df['group_max_origin']) df.loc[update_condition, 'Updated_Status'] = 'Done' # 清理临时中间列 df = df.drop(columns=['group_max_origin'])
运行结果
运行代码后输出的DataFrame和预期结果完全一致:
| ID | ID2 | Origin | Status | Updated_Status |
|---|---|---|---|---|
| 1 | 25 | 2005 | Done | |
| 1 | 29 | 2010 | Unfinished | Done |
| 1 | 56 | 2020 | Done | |
| 2 | 562 | 1995 | Done | |
| 2 | 92 | 1999 | Done | |
| 2 | 170 | 2007 | Unfinished |
如果需要直接修改原
Status列而不是新增Updated_Status列,只需要把赋值目标从Updated_Status改成Status即可。
内容的提问来源于stack exchange,提问作者user4740374
相关产品推荐
相关产品推荐

