按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:分组取最大日期后筛选
- 先把
date列转为日期类型(推荐操作):
df['date'] = pd.to_datetime(df['date'])
- 按
id分组,获取每个id对应的最新日期:
max_dates = df.groupby('id')['date'].max().reset_index()
- 合并原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
相关产品推荐
相关产品推荐

