【问题标题】:Python Pandas: drop duplicate rows (keep only first row) based on same id and same datePython Pandas:基于相同的 id 和相同的日期删除重复的行(仅保留第一行)
【发布时间】:2021-12-04 23:39:49
【问题描述】:

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

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(及其各自的行)?

提前致谢。

【问题讨论】:

  • 除了seen 之外的所有内容如何分组并保留第一条记录,即 - `df.groupby(["id", "year", "month", "day"]) 。第一的()?您可以在之后重置索引
  • 刚试过。没用。还会从其他日期完全删除一些 ID。
  • 您可以按多列删除重复项:df.sort_values(["seen"]).drop_duplicates(["id", "year", "month", "day"])

标签: python pandas dataframe duplicates


【解决方案1】:

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

# 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

【讨论】:

    【解决方案2】:

    你也可以试试:

    #你的数据框:

    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'])
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-04-10
      • 1970-01-01
      • 2015-11-30
      • 1970-01-01
      • 2022-08-20
      • 1970-01-01
      • 2019-04-21
      • 1970-01-01
      相关资源
      最近更新 更多