You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于重复项与日期条件的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 16:32:55