通过开始和结束事件将熊猫事件分组

时间:2018-07-09 20:54:12

标签: pandas time-series

我有一些类似以下的事件:

   |  time             |  type
-----------------------------------
1  |  2016-08-26 20:57 |  start
2  |  2016-08-26 20:28 |  event 1
3  |  2016-08-26 21:00 |  end
4  |  2016-08-26 21:27 |  start
5  |  2016-08-26 21:30 |  event 2
6  |  2016-08-26 21:32 |  event 3
7  |  2016-08-26 21:33 |  end

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

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

This other answer做类似的事情。它将事件发生在彼此之间的6小时内。就我而言,我无法查看上一行来决定是在新会话中还是在新会话中使用新事件,所以我要回避循环。

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

仅当“类型”为“开始”时,创建与行号相同的新列(例如“会话”):

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

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