为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

月关宝盒 2023-09-12 17:29:05
我想将紧密发生的事件分组到父事件中。一个例子是这样的:import pandas as pddf = 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')但它似乎只想合并到一个最近的事件,而不是某种选项或方式来合并每行容差内的所有事件(显然只是在我的结果中获得更多行,因此它更像是范围)。我认为对这样的时间序列事件进行分组一定是相当常见的,但在 Pandas 中找不到任何明显的函数来做到这一点,或者也许我错过了一些东西。一如既往,如果我可以避免的话,尽量避免自己通过循环或类似的方式编写代码:)
查看完整描述

1 回答

?
holdtom

TA贡献1805条经验 获得超10个赞

一个想法是过滤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_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]


查看完整回答
反对 回复 2023-09-12
  • 1 回答
  • 0 关注
  • 73 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信