Pandas DataFrame去重时保留分组内最早记录的实现方法
Pandas按分组取首次作答记录解决方案
方案1:先排序再去重(可行)
你提到的先按time排序再执行去重的思路完全可行,实现逻辑如下:
- 首先对time字段做升序排序,确保每个分组下更早的记录排在前面
- 再执行drop_duplicates保留每个分组的第一条记录
代码示例:
# 按作答时间升序排序 df_sorted = df.sort_values(by='time', ascending=True) # 按分组去重,保留第一条(即最早的)记录 deduped = df_sorted.drop_duplicates(subset=["name", "job", "question"], keep="first").reset_index(drop=True)
方案2:groupby取最小时间索引(更安全稳定)
更推荐用分组直接取最小时间对应行的方案,不需要调整全表顺序,逻辑更直接也更稳定,完全不受原数据顺序影响:
# 按分组获取每个分组下time最小的记录的索引 min_time_idx = df.groupby(['name', 'job', 'question'])['time'].idxmin() # 根据索引提取对应行 deduped = df.loc[min_time_idx].reset_index(drop=True)
注意事项
你的time字段已经是datetime64[ns, UTC]类型,所有记录时区统一,直接比较大小、排序都不会有问题,不需要额外做时区转换处理。
内容来源stack exchange,提问作者futuredataengineer
相关产品推荐
相关产品推荐

