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]