【问题标题】:Group pandas events by start and end events按开始和结束事件对 pandas 事件进行分组
【发布时间】:2018-12-17 15:05:30
【问题描述】:

我的事件如下所示:

|时间 |类型 ---------------------------------- 1 | 2016-08-26 20:57 |开始 2 | 2016-08-26 20:28 |事件 1 3 | 2016-08-26 21:00 |结尾 4 | 2016-08-26 21:27 |开始 5 | 2016-08-26 21:30 |事件 2 6 | 2016-08-26 21:32 |活动 3 7 | 2016-08-26 21:33 |结尾

我想将上述数据分组到由startend 事件界定的“会话”中。因此,第 1 到第 3 行将在一个会话中,第 4 到第 7 行将在另一个会话中。请注意,startend 也算作事件,所以我不想从最终结果中消除它们。

我想出的唯一办法是创建一个新列,在其中我为每一行分配一个“会话 ID”,然后在该列上简单地 groupby。我可以遍历事件并手动执行,但我想知道是否有矢量化方式来执行此操作。

This other answer 做了类似的事情。它将彼此相隔 6 小时内发生的事件分组。就我而言,我无法查看前一行来决定新事件是应该在新会话中还是当前会话中,所以我回到尝试避免循环。

感谢任何帮助。

【问题讨论】:

    标签: pandas time-series


    【解决方案1】:

    仅当“类型”为“开始”时才创建等于行号的新列(例如“会话”):

    df.loc[df.type=='start', 'session'] = df.index[df.type=='start']
    

    用最近定义的行值向前填充新列的未定义行:

    df.session = df.session.fillna(method='ffill').astype(int)
    #               time     type  session
    #1  2016-08-26 20:57    start      1
    #2  2016-08-26 20:28  event 1      1
    #3  2016-08-26 21:00      end      1
    #4  2016-08-26 21:27    start      4
    #5  2016-08-26 21:30  event 2      4
    #6  2016-08-26 21:32  event 3      4
    #7  2016-08-26 21:33      end      4
    

    现在,每一行都属于一个唯一的组。

    【讨论】:

    • 太棒了!非常感谢!我结束了 end 事件的反向填充,因为我有可能在 start 事件之前有一个 setup 事件,我希望将它捆绑在同一个会话中。
    猜你喜欢
    • 1970-01-01
    • 2021-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-30
    • 1970-01-01
    • 2020-03-09
    • 1970-01-01
    相关资源
    最近更新 更多