Мы можем сделать это с помощью 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
Скотт Бостон предлагает приятное улучшение вышеупомянутого решения, используя cumprod
на логической маске.Принцип тот же, но более чистый:
df[df.col2.ne('event2').groupby(df.Col1).cumprod()]
Col1 col2
0 A event1
4 B event1
5 B event3
groupby
+ idxmax
фильтрация на основе, предложенная WB:
df[df.index < df.col2.eq('event2').groupby(df.Col1).transform('idxmax')]
Col1 col2
0 A event1
4 B event1
5 B event3