sql - 如果重复意味着少于 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 天内
解决方案
你可以试试这个:
- 将日期转换为
datetime64
- 从每个组中获取第一个日期
df.groupby('ID')['DATE'].transform('first')
- 添加过滤器以仅保留超过 30 天的日期
- 将每个组的第一个日期附加到数据框
代码:
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
推荐阅读
- javascript - 字符串后的正则表达式多行匹配
- javascript - 使用甜蜜警报 2 向对象添加键值项时出现问题
- c++ - 为字符串中的每个第 N 个字符插入一个空格的函数没有按我认为的方式工作?
- kubernetes - Kubernetes - 登录到 Kubernetes 仪表板问题
- windows - VcXsrv 基于主机的访问控制不起作用
- python - Keras 保存模型
- django - Django - 防止用户在输入 URL 时访问页面
- reactjs - 如何在 React Native 中导入自定义 svgs 图标
- java - 如何使用 lambda 表达式实现具有两个输入的递归函数?
- python - 简单的 if 语句不能准确地检查两个值是否相同