首页 > 解决方案 > 如果重复意味着少于 30 天,我如何删除重复?

问题描述

(使用 sql 或 pandas)如果两条记录之间的日期差异小于 30 天,我想删除记录。但必须保留 ID 的第一条记录。

#example
ROW ID  DATE  
1   A   2020-01-01 -- first  
2   A   2020-01-03  
3   A   2020-01-31  
4   A   2020-02-05  
5   A   2020-02-28  
6   A   2020-03-09  
7   B   2020-03-06 -- first  
8   B   2020-05-07  
9   B   2020-06-02  

#expected results
ROW ID  DATE  
1   A   2020-01-01  
4   A   2020-02-05  
6   A   2020-03-09  
7   B   2020-03-06  
8   B   2020-05-07  

第 2,3 行是从第 1 行算起的 30 天内 第 5 行是从第 4 行算起的 30 天内 第 9 行是从第 8 行算起的 30 天内

标签: sqlpandas

解决方案


你可以试试这个:

  1. 将日期转换为datetime64
  2. 从每个组中获取第一个日期df.groupby('ID')['DATE'].transform('first')
  3. 添加过滤器以仅保留超过 30 天的日期
  4. 将每个组的第一个日期附加到数据框

代码:

df['DATE'] = pd.to_datetime(df['DATE'])

df1 = df[(df['DATE'] - df.groupby('ID')['DATE'].transform('first')) >= pd.Timedelta(30, unit='D')]
df1 = df1.append(df.groupby('ID', as_index=False).agg('first')).sort_values(by=['ID', 'DATE'])
print(df1)


   ROW ID       DATE
0    1  A 2020-01-01
2    3  A 2020-01-31
3    4  A 2020-02-05
4    5  A 2020-02-28
5    6  A 2020-03-09
1    7  B 2020-03-06
7    8  B 2020-05-07
8    9  B 2020-06-02

推荐阅读