基于重复项与日期条件的Pandas行删除方法
问题描述
我有如下Pandas DataFrame:
df = """ doc_id X1 Y1 Z1 Date 2 33075059515 30x RU 5 2014-01-15T00:00:00Z 3 53075235984 50x RU 6 2011-01-09T00:00:00Z 4 28865465787 30x RU NaN 2014-01-23T00:00:00Z 5 28865465787 30x SO 5 2021-06-03T12:00:00Z 6 28865465787 50x SO 4 2011-02-03T00:00:00Z 8 87652548931 50x SO NaN 2016-10-27T12:00:00Z """
我需要删除满足以下条件的行:
- 该行在
X1和Y1列与其他行重复 - 该行
Date列的日期与另一行的日期间隔在4周内
期望得到的结果如下:
df = """ doc_id X1 Y1 Z1 Date 2 33075059515 30x RU 5 2014-01-15T00:00:00Z 3 53075235984 50x RU 6 2011-01-09T00:00:00Z 5 28865465787 30x SO 5 2021-06-03T12:00:00Z 6 28865465787 50x SO 4 2011-02-03T00:00:00Z 8 87652548931 50x SO NaN 2016-10-27T12:00:00Z """
仅删除X1和Y1列的重复项操作很简单,但我无法将其与日期的4周滚动窗口条件相结合。
补充示例
输入数据
doc_id X1 Y1 Z1 Date 1 68754534654 30x RU 5 2014-01-14T00:00:00Z 2 33075059515 30x RU 5 2014-01-15T00:00:00Z 3 53075235984 50x RU 6 2011-01-09T00:00:00Z 4 28865465787 30x RU NaN 2014-01-23T00:00:00Z 5 28865465787 30x SO 5 2021-06-03T12:00:00Z 6 28865465787 50x SO 4 2011-02-03T00:00:00Z 7 78764599568 50x SO NaN 2016-10-27T12:00:00Z 8 87652548931 50x SO NaN 2016-10-27T12:00:00Z
当前不符合预期的输出
其中加粗的行也应被删除:
doc_id X1 Y1 Z1 Date 1 68754534654 30x RU 5 2014-01-14T00:00:00Z 3 53075235984 50x RU 6 2011-01-09T00:00:00Z **4 28865465787 30x RU NaN 2014-01-23T00:00:00Z** 5 28865465787 30x SO 5 2021-06-03T12:00:00Z 6 28865465787 50x SO 4 2011-02-03T00:00:00Z 7 78764599568 50x SO NaN 2016-10-27T12:00:00Z **8 87652548931 50x SO NaN 2016-10-27T12:00:00Z**
解决方案
步骤1:处理日期格式
首先将Date列转换为datetime类型,方便后续计算:
df['Date'] = pd.to_datetime(df['Date'])
步骤2:分组并标记需要删除的行
按X1和Y1分组,对每组内的日期排序后,使用滚动窗口检查相邻行是否在4周(28天)内,标记重复且符合日期条件的行:
import pandas as pd # 转换日期格式 df['Date'] = pd.to_datetime(df['Date']) # 按X1、Y1分组,每组内按日期排序 grouped = df.sort_values(['X1', 'Y1', 'Date']).groupby(['X1', 'Y1']) # 标记需要保留的行:组内第一行保留,当前行与前一行日期差超过28天则保留 df['keep'] = grouped['Date'].transform( lambda x: (x.diff().dt.days > 28) | x.diff().isna() ) # 筛选保留的行,删除临时标记列 result = df[df['keep']].drop('keep', axis=1)
验证结果
针对补充的输入数据,执行上述代码后会得到正确结果:
- 行2被删除(与行1日期差1天,在4周内)
- 行4被删除(与行2日期差8天,在4周内)
- 行8被删除(与行7日期差0天,在4周内)
最终结果完全符合预期。
内容的提问来源于stack exchange,提问作者jesspi
相关产品推荐
相关产品推荐

