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

如何在pandas DataFrame的groupby操作中提取分组内的最新日期

实现方法

首先需先将日期列转换为pandas日期类型,避免字符串比较出现逻辑错误,共有两种常用实现方案:

方案1:groupby 直接聚合

该方案逻辑直观,适合数据量较大的场景:

import pandas as pd

# 构造示例数据集(补全原代码缺失的闭合括号)
df = pd.DataFrame({
    'ID': ['abc', 'def', 'abc', 'abc'], 
    'name':['Alex','Bertie','Alex','Alex'],
    'date_attended':['01/01/2021','05/01/2021','11/01/2021','20/01/2021']
})

# 转换为日期格式,指定日/月/年的解析规则
df['date_attended'] = pd.to_datetime(df['date_attended'], format='%d/%m/%Y')

# 按ID、姓名分组,取每组的最大出席日期
result = df.groupby(['ID', 'name'], as_index=False)['date_attended'].max()

# 按需将日期转回原字符串格式、删除ID列得到最终结果
result['date_attended'] = result['date_attended'].dt.strftime('%d/%m/%Y')
result = result.drop(columns='ID')

print(result)

方案2:排序后去重

该方案代码更简洁,适合中小规模数据集:

# 日期转换步骤和上文一致
df['date_attended'] = pd.to_datetime(df['date_attended'], format='%d/%m/%Y')

# 按日期升序排序后,按ID、姓名去重,保留每组最后一条(即日期最大的记录)
result = df.sort_values('date_attended').drop_duplicates(['ID', 'name'], keep='last')

# 同样按需转格式、删ID列
result['date_attended'] = result['date_attended'].dt.strftime('%d/%m/%Y')
result = result.drop(columns='ID')
原代码报错原因
  • 调用transform('max')后会返回和原数据集行数完全一致的结果,后续再调用size()会直接返回所有元素的总计数,完全不符合取分组最大值的需求
  • 未提前将日期列转换为日期类型,当前示例下字符串取max刚好生效,若日期格式出现变化会直接出现逻辑错误
  • 分组后未保留姓名字段,最终结果会丢失姓名信息

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 00:42:02