如何在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)
预期输出
| ID | Date | isDeprecated |
|---|---|---|
| 23 | 01.01.2023 | False |
| 23 | 06.01.2023 | False |
| 24 | 09.01.2023 | False |
| 26 | 02.01.2023 | False |
| 26 | 09.01.2023 | False |
| 28 | 01.01.2023 | False |
| 28 | 02.01.2023 | False |
| 28 | 03.01.2023 | True |
| 17 | 28.12.2022 | False |
| 17 | 29.12.2022 | False |
| 17 | 09.01.2023 | False |
| 19 | 09.01.2023 | False |
| 20 | 28.12.2022 | True |
解决方案
在代码中# 此处需补充逻辑的位置,替换为以下代码即可实现需求:
# 标记每组的最后一条记录 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)
逻辑解释
- 通过
groupby('ID').cumcount(ascending=False)为每组记录倒序计数,计数为0的即为该组最后一条记录,用临时列is_last_record标记 - 同时满足「是最后一条记录」和「Date不在latest_dates数组中」两个条件时,将对应记录的
isDeprecated设为True - 最后删除临时标记列,避免冗余数据
内容的提问来源于stack exchange,提问作者hm2330
相关产品推荐
相关产品推荐

