根据条件对行进行分组和分组

时间:2018-12-27 15:27:21

标签: python pandas dataframe group-by pandas-groupby

我要过滤我的数据框。

我的数据框

GUID

输出数据框

  Col1    col2
0    A  event1
1    A  event2
2    A  event3
3    A  event2
4    B  event1
5    B  event3
6    B  event2
7    B  event2

它应返回每个组在event2之前的行。 到目前为止,我尝试过

  Col1    col2
     A  event1
     B  event1
     B  event3

但是它没有返回所需的行。

1 个答案:

答案 0 :(得分:4)

我们可以使用groupbycumsum进行此操作,然后执行最后的过滤步骤:

df[df.col2.eq('event2').groupby(df.Col1).cumsum().eq(0)]

  Col1    col2
0    A  event1
4    B  event1
5    B  event3

要将索引重置为单调递增的范围,请使用

df[df.col2.eq('event2').groupby(df.Col1).cumsum().eq(0)].reset_index(drop=True)

  Col1    col2
0    A  event1
1    B  event1
2    B  event3

Scott Boston建议对布尔掩码使用cumprod对上述解决方案进行很好的改进。原理是一样的,但是更干净:

df[df.col2.ne('event2').groupby(df.Col1).cumprod()]

  Col1    col2
0    A  event1
4    B  event1
5    B  event3

由W-B建议的

groupby + idxmax过滤:

df[df.index < df.col2.eq('event2').groupby(df.Col1).transform('idxmax')]

  Col1    col2
0    A  event1
4    B  event1
5    B  event3