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

如何在Pandas中利用groupby修改分组最后一行的isDeprecated状态

需求说明
  • 按ID分组后,若该组最后一条记录的Date不在latest_dates数组中,将该记录的isDeprecated字段设为True
  • 仅修改每组的最后一条记录,用于追踪其被标记为弃用的时间

现有代码
import pandas as pd

data = {
    'ID': [23, 23, 24, 26, 26, 28, 28, 28, 17, 17, 17, 19, 20],
    'Date': ['01.01.2023', '06.01.2023', '09.01.2023', '02.01.2023', '09.01.2023',
             '01.01.2023', '02.01.2023', '03.01.2023', '28.12.2022', '29.12.2022',
             '09.01.2023', '09.01.2023', '28.12.2022']
}

df = pd.DataFrame(data)

df['Date'] = pd.to_datetime(df['Date'], format='%d.%m.%Y')

df['isDeprecated'] = False

latest_dates = df['Date'].unique()

latest_dates.sort()

# 取最近的两个日期
latest_dates = latest_dates[-2:]

# 此处需补充逻辑

print(df)

预期输出
IDDateisDeprecated
2301.01.2023False
2306.01.2023False
2409.01.2023False
2602.01.2023False
2609.01.2023False
2801.01.2023False
2802.01.2023False
2803.01.2023True
1728.12.2022False
1729.12.2022False
1709.01.2023False
1909.01.2023False
2028.12.2022True

解决方案

在代码中# 此处需补充逻辑的位置,替换为以下代码即可实现需求:

# 标记每组的最后一条记录
df['is_last_record'] = df.groupby('ID').cumcount(ascending=False) == 0

# 对符合条件的最后一条记录,设置isDeprecated为True
df.loc[df['is_last_record'] & ~df['Date'].isin(latest_dates), 'isDeprecated'] = True

# 移除临时标记列(可选操作,保持数据整洁)
df.drop('is_last_record', axis=1, inplace=True)

逻辑解释

  1. 通过groupby('ID').cumcount(ascending=False)为每组记录倒序计数,计数为0的即为该组最后一条记录,用临时列is_last_record标记
  2. 同时满足「是最后一条记录」和「Date不在latest_dates数组中」两个条件时,将对应记录的isDeprecated设为True
  3. 最后删除临时标记列,避免冗余数据

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 21:54:52