Python/Pandas基于窗口将关闭事件分组在一起
我想将一起发生的事件分组为父事件 例如:Python/Pandas基于窗口将关闭事件分组在一起,python,pandas,time-series,Python,Pandas,Time Series,我想将一起发生的事件分组为父事件 例如: import pandas as pd df = pd.DataFrame( [ ['2020-01-01 10:00', '1'], ['2020-01-01 10:01', '2'], ['2020-01-01 10:02', '3a'], ['2020-01-01 10:02', '3b'], ['2020-01-01 10:30', '4'],
import pandas as pd
df = pd.DataFrame(
[
['2020-01-01 10:00', '1'],
['2020-01-01 10:01', '2'],
['2020-01-01 10:02', '3a'],
['2020-01-01 10:02', '3b'],
['2020-01-01 10:30', '4'],
['2020-01-01 10:50', '5'],
['2020-01-01 10:54', '6'],
['2020-01-01 10:55', '7'],
], columns=['event_time', 'event_id']
)
df['event_time'] = pd.to_datetime(df['event_time'])
在上面的窗口大小为1分钟的示例中,我想要的是每个事件的+-1分钟内发生的所有其他事件的列表
比如:
df = pd.DataFrame(
[
['2020-01-01 10:00', '1', ['2']],
['2020-01-01 10:01', '2', ['1','3a','3b']],
['2020-01-01 10:02', '3a', ['2','3b']],
['2020-01-01 10:02', '3b', ['3a', '2'],
['2020-01-01 10:30', '4', None],
['2020-01-01 10:50', '5', None],
['2020-01-01 10:54', '6', ['7']],
['2020-01-01 10:55', '7', ['6']],
], columns=['event_time', 'event_id', 'related_event_id_list']
)
我几乎能够接近熊猫:
但它似乎只是想合并到一个最近的事件,而不是某种选项或方式来合并每行公差范围内的所有事件(显然只是在我的结果中获得更多的行,因此更像是一个范围上的外部联接)
我在想,像这样的时间序列事件分组一定很常见,但在熊猫身上找不到任何明显的功能来实现这一点,或者我遗漏了一些东西
如果我可以避免的话,我总是试图避免自己通过循环或类似的方式编写代码:)一个想法是通过删除原始行来过滤
DataFrame
:
我想对于
'2020-01-01 10:02','3b'
相关的事件应该是[2,3a]
?哦,是的-很好的捕获,修复了这个问题。
pd.merge_asof(df,df, on="event_time", tolerance=pd.Timedelta("1m"), allow_exact_matches=False, direction='nearest')
td = pd.Timedelta("1m")
f = lambda x, y: df.loc[df['event_time'].between(y - td, y + td),
'event_id'].drop(x).tolist()
df['related_event_id_list'] = [f(k, v) for k, v in df['event_time'].items()]
print (df)
event_time event_id related_event_id_list
0 2020-01-01 10:00:00 1 [2]
1 2020-01-01 10:01:00 2 [1, 3a, 3b]
2 2020-01-01 10:02:00 3a [2, 3b]
3 2020-01-01 10:02:00 3b [2, 3a]
4 2020-01-01 10:30:00 4 []
5 2020-01-01 10:50:00 5 []
6 2020-01-01 10:54:00 6 [7]
7 2020-01-01 10:55:00 7 [6]