Python Pandas如何按id和日期去重(每日仅保留每个id的第一条记录)
解决方案
你需要在drop_duplicates方法中通过subset参数指定id+日期维度的组合作为重复判定标准,即可实现单日维度的id去重,不会影响其他日期的同id记录。
方法1:基于现有年、月、日字段实现
你的表中已经有year、month、day三个可以确定唯一日期的字段,直接将这三个字段和id共同作为去重判定键即可:
# 按seen时间升序排序,默认保留每天同个id的第一条记录(即进入记录) df_filtered = df.sort_values("seen").drop_duplicates( subset=["id", "year", "month", "day"], keep="first" )
如果需要保留每天最晚的那条离开记录,将keep参数改为"last",或者将sort_values的排序规则改为倒序即可。
方法2:直接从时间字段提取日期(不依赖现有年日月字段)
如果不想依赖表中已有的年、月、日字段,也可以直接从seen时间列提取日期维度作为去重判定条件:
# 先提取纯日期字段作为去重判定维度 df["visit_date"] = df["seen"].dt.date # 去重后可按需删除新增的visit_date字段 df_filtered = df.sort_values("seen").drop_duplicates( subset=["id", "visit_date"], keep="first" ).drop(columns="visit_date")
实现原理
drop_duplicates的subset参数用于指定判断重复的列组合,只有这些列的取值完全一致时才会被判定为重复项。上述两种写法中,同个id在不同日期的记录因为日期维度字段取值不同,不会被判定为重复,因此不会被误删,完全匹配单天去重的需求。
内容的提问来源于stack exchange,提问作者MHernandez22
相关产品推荐
相关产品推荐

