如何从Pandas DataFrame提取每个ID各年度最大日期对应的行
Pandas 提取每个ID每年最大日期对应行方案
你的原始示例数据结构如下:
ID Date Value 2 2020-06-30 124 1 2020-09-30 265 1 2021-12-31 140 1 2020-12-31 142 2 2020-12-31 147 1 2019-12-31 677 1 2021-03-31 235 2 2021-09-30 917 2 2021-03-31 149
实现逻辑
核心是把「ID」和「日期所属年份」同时作为分组键,再筛选每个分组下日期最大的行,注意要先把Date列转为datetime类型,避免字符串排序不符合日期逻辑。
可直接运行的代码
import pandas as pd # 1. 构造示例数据(你自己使用时替换成读取本地数据的代码即可) df = pd.DataFrame({ 'ID': [2,1,1,1,2,1,1,2,2], 'Date': ['2020-06-30','2020-09-30','2021-12-31','2020-12-31','2020-12-31','2019-12-31','2021-03-31','2021-09-30','2021-03-31'], 'Value': [124,265,140,142,147,677,235,917,149] }) # 2. 核心处理步骤 df['Date'] = pd.to_datetime(df['Date']) # 将字符串转为标准日期格式 # 按ID、年份分组,取每组日期最大的行,最后排序重置索引 result = df.loc[ df.groupby([ 'ID', df['Date'].dt.year # 提取日期对应的年份作为分组维度 ])['Date'].idxmax() # 定位每个分组内Date值最大的行索引 ].sort_values(['ID', 'Date']).reset_index(drop=True)
运行后result的输出和你预期完全一致:
ID Date Value 0 1 2019-12-31 677 1 1 2020-12-31 142 2 1 2021-12-31 140 3 2 2020-12-31 147 4 2 2021-09-30 917
如果是小数据集,也可以用排序后取分组尾行的写法,逻辑更直观:
result = df.sort_values('Date').groupby( ['ID', df['Date'].dt.year], as_index=False ).tail(1).sort_values(['ID','Date']).reset_index(drop=True)
两种写法输出结果完全相同,大数据集场景下优先选idxmax()的写法,性能更好。
内容的提问来源于stack exchange,提问作者PolarVertex
相关产品推荐
相关产品推荐

