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'])
我有一个如下所示的数据框:
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'])