我要过滤我的数据框。
我的数据框
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
但是它没有返回所需的行。
答案 0 :(得分:4)
我们可以使用groupby
和cumsum
进行此操作,然后执行最后的过滤步骤:
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
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