如何在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
相关产品推荐
相关产品推荐

