如何找到多个行对(在配对成员之间有潜在的行)

时间:2017-09-05 20:32:56

标签: python pandas

抱歉,我发现问题标题有点模糊,我不确定如何说出这个问题。希望这个例子能够成为我想要做的事情。

我有一个像这样的数据框:

    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)

我意识到这完全改变了问题的本质。很抱歉没有提到它。堆栈是否是处理此问题的最简单方法?

2 个答案:

答案 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)]