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

按ID筛选Python DataFrame每个ID的最新日期多行数据

问题:筛选每个ID对应的最新日期数据(保留同日期多行)

我有一个包含id、info和date列的DataFrame,其中date列数据类型为object。需求是筛选出每个id对应的最新日期数据,且同一id下如果有多条相同最新日期的行,需要保留这些行(因为其他列包含有效业务数据)。

我尝试了以下代码,但得不到预期结果:

df = pd.DataFrame({'id': [1,1,1,1,1,2,2,2,2,2],
                   'info':['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'],
                   'date': ['2023-01-09', '2023-01-09', '2023-01-01', '2023-01-01', 
                            '2023-01-06', '2023-02-02','2023-01-10', '2023-02-02', 
                            '2023-01-10', '2022-12-20']})

df.sort_values(by=['date']).drop_duplicates(subset='id', keep='first')

原始DataFrame数据

id  info    date
1   a   2023-01-09
1   b   2023-01-09
1   c   2023-01-01
1   d   2023-01-01
1   e   2023-01-06
2   f   2023-02-02
2   g   2023-01-10
2   h   2023-02-02
2   i   2023-01-10
2   j   2022-12-20

数据类型

id       int64
info    object
date    object
dtype: object

期望结果

id  info    date
1   a   2023-01-09
1   b   2023-01-09
2   f   2023-02-02
2   h   2023-02-02

问题分析

原来的代码问题在于:

  • drop_duplicates(subset='id')会直接删除每个id的重复行,只保留一条,不符合“保留同最新日期所有行”的需求;
  • date列是object类型,虽然本例中字符串格式的日期排序能生效,但如果日期格式不规范(比如01-09-2023),字符串排序会出错,所以建议先转为日期类型。

解决方法

方法1:分组取最大日期后筛选

  1. 先把date列转为日期类型(推荐操作):
df['date'] = pd.to_datetime(df['date'])
  1. 按id分组,获取每个id对应的最新日期:
max_dates = df.groupby('id')['date'].max().reset_index()
  1. 合并原DataFrame和max_dates,筛选出符合条件的行:
result = df.merge(max_dates, on=['id', 'date'], how='inner')

方法2:用transform直接标记有效行

这种方法更简洁,一步到位:

# 转换日期类型
df['date'] = pd.to_datetime(df['date'])
# 对每个id组,判断当前行的date是否等于组内最大date
result = df[df.groupby('id')['date'].transform('max') == df['date']]

两种方法都能得到预期结果,且保留了同一id下最新日期的所有行。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 11:15:38