Python Pandas:根据相同的 ID 和相同的日期删除重复行(仅保留第一行)

Python Pandas: drop duplicate rows (keep only first row) based on same id and same date

我有一个如下所示的数据框:

id seen year month day dayname
f907942e330ac3653f8a9bd655770872 2021-06-02 16:34:56 2021 6 1 Monday
042b60106231fa8a8e43dd750432d5bc 2021-06-02 16:13:29 2021 6 1 Monday

ID 列具有重复值,因为它会在用户进入建筑物时创建一个条目,而在用户离开建筑物时创建第二个条目。

我想做的是删除每天所有重复的 id 值。例如,一个人可以在 2021 年 1 月 1 日星期一和 2021 年 1 月 3 日星期三去那栋楼,假设创建了 4 个条目,2 个用于星期一,2 个用于星期三,我只想保留一个用于每个具体日期。

如您所想,我已经尝试过 df_filtered = df.sort_values(["seen"]).drop_duplicates("id") 之类的方法,但它对我不起作用,因为它删除了数据帧中的所有重复值。

如何在不影响其他日子的情况下删除每一天重复的 ID(及其各自的行)?

提前致谢。

您可以使用 pd.to_datetime + dt.normalize(), and use GroupBy.first() 尝试按 id 和列 seen 的日期(无时间)进行分组,以获取每个组的第一个条目,如下所示:

# Optionally convert to datetime if not already in datetime format
df['seen'] = pd.to_datetime(df['seen'])

df.groupby(['id', df['seen'].dt.normalize()], as_index=False, sort=False).first()

演示

数据输入:

(添加了一些行以进行更全面的测试):

df

                                 id                 seen  year  month  day    dayname
0  f907942e330ac3653f8a9bd655770872  2021-06-02 16:34:56  2021      6    2     Monday
1  f907942e330ac3653f8a9bd655770872  2021-06-02 17:54:56  2021      6    2     Monday
2  042b60106231fa8a8e43dd750432d5bc  2021-06-02 16:13:29  2021      6    2     Monday
3  f907942e330ac3653f8a9bd655770872  2021-06-04 16:22:56  2021      6    4  Wednesday
4  f907942e330ac3653f8a9bd655770872  2021-06-04 17:43:56  2021      6    4  Wednesday

输出:

                                 id                 seen  year  month  day    dayname
0  f907942e330ac3653f8a9bd655770872  2021-06-02 16:34:56  2021      6    2     Monday
1  042b60106231fa8a8e43dd750432d5bc  2021-06-02 16:13:29  2021      6    2     Monday
2  f907942e330ac3653f8a9bd655770872  2021-06-04 16:22:56  2021      6    4  Wednesday

您也可以试试:

#你的数据框:

df=pd.DataFrame({'id':['f907942e330ac3653f8a9bd655770872','042b60106231fa8a8e43dd750432d5bc'],\
                 'seen':['2021-06-02 16:34:56','2021-06-02 16:13:29'],
                 'year':['2021','2021'],\
                'month':[6,6],'day':[1,1],'dayname':['Monday','Monday']})

#使用drop_duplicates

df_nodups=df.drop_duplicates(subset=['id','year','month','day'])