我有一个像这样的数据框:
Time Event
0 .1 start
1 .2 end
2 .3 start
3 .4 foo
4 .5 bar
5 .6 end
我试图得到相应的开始和结束行的索引(所以在这个例子中,对(0,1)和(2,5))。
我不完全确定如何编写此代码的矢量化版本。我可以在一个循环中相当容易地做到这一点,但我试图避免它。
可以做出的假设:
- 每个开始都有一个相关的结束
- 开始和结束可以在它们之间有其他事件
任何帮助都将不胜感激。
编辑:我意识到我的问题错过了一个关键案例。我可以在另一个事件中开始一个事件。所以数据框如:
Time Event
0 .1 start
1 .2 start
2 .3 end
3 .4 foo
4 .5 bar
5 .6 end
其中结果应为(0,2),(1,5)
我意识到这完全改变了问题的本质。很抱歉没有提到它。堆栈是否是处理此问题的最简单方法?
答案 0 :(得分:2)
试试这个?
df['Group']=df.Event.eq('start').cumsum()
df.groupby('Group').agg(['idxmin','idxmax'])
Out[797]:
Time
idxmin idxmax
Group
1 0 1
2 2 5
或者你可以有一个列表输出
df.groupby('Group').agg(['idxmin','idxmax']).values.tolist()
Out[800]: [[0, 1], [2, 5]]
答案 1 :(得分:2)
获取两个不同列表中的索引并加入列表以创建元组
start = df[(df['Event'] == 'start')].index
end = df[(df['Event'] == 'end')].index
[(i1, i2) for i1, i2 in zip(start, end) if i1 < i2]
你得到了
[(0, 1), (2, 5)]
它将处理任何非偶数对的起始端。使用您更新的数据框,
Time Event
0 .1 start
1 .2 start
2 .3 end
3 .4 foo
4 .5 bar
5 .6 end
此解决方案提供
[(0, 2), (1, 5)]