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

如何从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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 09:21:37