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

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和预期结果完全一致:

IDID2OriginStatusUpdated_Status
1252005Done
1292010UnfinishedDone
1562020Done
25621995Done
2921999Done
21702007Unfinished

如果需要直接修改原Status列而不是新增Updated_Status列,只需要把赋值目标从Updated_Status改成Status即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 13:09:17