我有一些类似以下的事件:
| 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
我想将以上数据分组为受start
和end
事件限制的“会话”。因此,第1到3行将在一个会话中,第4到7行将在另一会话中。请注意,start
和end
也算作事件,因此我不想从最终结果中消除它们。
我唯一想到的是创建一个新列,在其中为每行分配一个“会话ID”,然后在该列上简单地groupby
。我可以遍历事件并手动执行,但是我想知道是否存在矢量化方法。
This other answer做类似的事情。它将事件发生在彼此之间的6小时内。就我而言,我无法查看上一行来决定是在新会话中还是在新会话中使用新事件,所以我要回避循环。
感谢您的帮助。
答案 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
现在,每一行都属于一个唯一的组。