用于删除重复项的自定义逻辑

时间:2018-07-19 15:22:11

标签: python pandas drop-duplicates

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

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]
})

1 个答案:

答案 0 :(得分:3)

似乎您想要的逻辑可以通过使用pd.merge_asof进行自我合并来实现,该合并允许精确键和nearest键的匹配组合。

您将排除精确匹配,并使用默认的backward方向,这意味着在指定时间窗口内出现两个(或更多)条目的情况下,您将始终仅保留最早的时间条目。 / p>

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