【问题标题】:Custom logic for dropping duplicates删除重复项的自定义逻辑
【发布时间】:2018-07-19 15:22:10
【问题描述】:

我有以下数据集,我希望将一些自定义逻辑应用于:

data = pd.DataFrame({'ID': ['A','B','B','C','C','D','D'], 
'Date': ['2018-07-02T02:21:12.000+0000','2018-07-02T02:28:29.000+0000','2018-07-02T02:28:31.000+0000','2018-07-02T02:30:58.000+0000','2018-07-02T02:31:01.000+0000','2018-07-02T02:42:46.000+0000','2018-07-02T02:41:47.000+0000'],
'Action': ['Start','Start','Start','Stop','Stop','Start','Start'],
'Group': [5,13,13,19,19,2,2],
'Value': [100,110,110,95,95,280,280]
})

第 1:2、3:4 和 5:6 行都是相同的,只是“日期”列中的值相差几秒钟。如果 1) 相似行之间的“日期”时间增量小于 1 分钟,并且 2) 所有其他信息都相同,有没有办法删除重复项?

结果应如下所示:

result = pd.DataFrame({
'ID': ['A','B','C','D'], 
'Date': ['2018-07-02T02:21:12.000+0000','2018-07-02T02:28:29.000+0000','2018-07-02T02:30:58.000+0000','2018-07-02T02:42:46.000+0000'],
'Action': ['Start','Start','Stop','Start'],
'Group': [5,13,19,2],
'Value': [100,110,95,280]
})

【问题讨论】:

  • 这可能不明确。假设您在 2 分钟内有多行。您选择按哪个 1 分钟时段分组?
  • jpp 提出了一个很好的观点。我提供的解决方案是级联的,这意味着如果您在 59 秒内进行 10 次测量,您仍然只保留第一次测量,并考虑其他 9 次重复。也许这就是您想要的,但如果不是,您将需要执行一些其他类型的分桶。如果每个组只有 2 个日期,那真的不是问题。

标签: python pandas drop-duplicates


【解决方案1】:

您想要的逻辑似乎可以通过使用pd.merge_asof 的自合并来完成,它允许对精确键和nearest 键进行匹配。

您将排除完全匹配,并使用默认的backward 方向,这意味着如果在指定时间窗口内出现两个(或更多)条目,您将始终只保留最早的时间条目。

import pandas as pd

data['Date'] = pd.to_datetime(data.Date)
data = data.sort_values('Date')

merged = pd.merge_asof(
              data, 
              data.rename(columns={'Date': 'Date2'}), 
              by=[x for x in data.columns if x != 'Date'], 
              left_on='Date', right_on='Date2',
              direction='backward',
              allow_exact_matches=False)

# Remove duplicates within 1 minute
merged[((merged.Date - merged.Date2) > pd.Timedelta(minutes=1)) | (merged.Date2.isnull())].drop(columns='Date2')

输出:

  ID                Date Action  Group  Value
0  A 2018-07-02 02:21:12  Start      5    100
1  B 2018-07-02 02:28:29  Start     13    110
3  C 2018-07-02 02:30:58   Stop     19     95
5  D 2018-07-02 02:41:47  Start      2    280

【讨论】:

    猜你喜欢
    • 2021-01-04
    • 1970-01-01
    • 2015-09-12
    • 1970-01-01
    • 2015-02-22
    • 2015-07-10
    • 1970-01-01
    • 1970-01-01
    • 2020-01-27
    相关资源
    最近更新 更多