Pandas按ID分组并筛选保留每日最后一条datetime数据的实现方法
Pandas按ID分组后保留每日最晚录入行的解决方法
错误原因分析
你原有代码存在两个核心问题:
- 仅指定
id作为分组键,没有新增日期维度的分组条件,无法实现按日去重的需求 - 分组后仅提取了
time列做处理,没有保留和其他列的关联,无法返回完整行数据
正确实现代码
方法1:groupby + idxmax 取最大值索引(推荐,性能更稳定)
import pandas as pd # 模拟数据 df = pd.DataFrame({'id': [1, 1, 1], 'time': ['2011/10/10 10:00', '2011/10/10 10:05', '2011/10/11 14:00'], 'vals1': [3, 3, 1], 'vals2': [2, 3, 1]}) # 设置datetime类型 df['time'] = pd.to_datetime(df['time']) # 按id + 日期分组,取每个分组内time最大值对应的行索引 max_time_idx = df.groupby(['id', df['time'].dt.floor('d')])['time'].idxmax() # 按索引提取对应行,重置索引 result = df.loc[max_time_idx].reset_index(drop=True)
方法2:排序 + 去重(逻辑更直观)
# 先按时间升序排序 df_sorted = df.sort_values('time') # 按id + 日期去重,保留每个分组的最后一条(即时间最晚的)数据 result = df_sorted.drop_duplicates(subset=['id', df_sorted['time'].dt.floor('d')], keep='last').reset_index(drop=True)
两种方法输出结果都和你给出的预期结果一致。
内容的提问来源于stack exchange,提问作者John Stud
相关产品推荐
相关产品推荐

