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

Pandas DataFrame条件处理:同ID近2天重复行去重方法咨询

Pandas实现基于ID和日期间隔的行保留规则

首先明确你的需求场景:
原始DataFrame:

IDDateEvent_Type
101/01/2019A
101/01/2019B
202/01/2019A
302/01/2019A

期望输出:

IDDate
101/01/2019
202/01/2019
302/01/2019

核心规则:同一ID下,日期间隔≤2天的重复行只保留一行;间隔>2天的行全部保留。

下面是具体的实现步骤,每一步都有详细解释:

步骤1:准备数据并转换日期格式

首先要把Date列从字符串转为datetime类型,这是计算日期间隔的前提:

import pandas as pd

# 构造你的原始数据(如果是读取外部文件,用pd.read_csv等即可)
df = pd.DataFrame({
    'ID': [1, 1, 2, 3],
    'Date': ['01/01/2019', '01/01/2019', '02/01/2019', '02/01/2019'],
    'Event_Type': ['A', 'B', 'A', 'A']
})

# 转换Date列为datetime格式,注意这里的日期格式是dd/mm/yyyy
df['Date'] = pd.to_datetime(df['Date'], format='%d/%m/%Y')

步骤2:分组处理每个ID的日期

我们需要按ID分组,对每个组内的日期进行排序、计算间隔,然后过滤出符合规则的行:

def filter_date_group(group):
    # 先按日期排序,确保相邻日期是连续的
    group_sorted = group.sort_values('Date')
    # 计算当前日期与前一行日期的间隔天数
    group_sorted['date_diff'] = group_sorted['Date'].diff().dt.days
    # 标记需要保留的行:组内第一行(diff结果为NaN) 或者 间隔>2天的行
    keep_mask = group_sorted['date_diff'].isna() | (group_sorted['date_diff'] > 2)
    # 返回过滤后的行,并删除临时的date_diff列
    return group_sorted[keep_mask].drop(columns='date_diff')

# 应用分组过滤函数,group_keys=False避免保留分组索引
filtered_df = df.groupby('ID', group_keys=False).apply(filter_date_group)

步骤3:提取需要的列并整理结果

最后只保留ID和Date列,重置索引即可得到期望结果:

final_result = filtered_df[['ID', 'Date']].reset_index(drop=True)
print(final_result)

运行后输出:

ID       Date
0   1 2019-01-01
1   2 2019-01-02
2   3 2019-01-02

额外测试场景验证

如果你的数据中有同一ID下间隔超过2天的日期,比如:

test_df = pd.DataFrame({
    'ID': [1,1,1,2],
    'Date': ['01/01/2019', '02/01/2019', '05/01/2019', '02/01/2019'],
    'Event_Type': ['A','B','C','A']
})

处理后会得到:

ID       Date
0   1 2019-01-01
1   1 2019-01-05
2   2 2019-01-02

完全符合规则:01/01和02/01间隔1天(≤2),只保留第一行;01/01和05/01间隔4天(>2),保留两行。

内容的提问来源于stack exchange,提问作者alwayscurious

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 06:23:07