我希望将以下自定义逻辑应用于以下数据集:
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]
})
答案 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