Python/Pandas 基于窗口将关闭事件分组在一起

我想将紧密发生的事件分组到父事件中。


一个例子是这样的:


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']

)

我几乎能够接近 pandas merge_asof:


pd.merge_asof(df,df, on="event_time", tolerance=pd.Timedelta("1m"), allow_exact_matches=False, direction='nearest')

https://img4.mukewang.com/65002f8e000110d802850251.jpg

但它似乎只想合并到一个最近的事件,而不是某种选项或方式来合并每行容差内的所有事件(显然只是在我的结果中获得更多行,因此它更像是范围)。


我认为对这样的时间序列事件进行分组一定是相当常见的,但在 Pandas 中找不到任何明显的函数来做到这一点,或者也许我错过了一些东西。


一如既往,如果我可以避免的话,尽量避免自己通过循环或类似的方式编写代码:)


月关宝盒
浏览 75回答 1
1回答

holdtom

一个想法是过滤DataFrame每行并删除原始行DataFrame.drop: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_list0 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]
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python