Группировка и подстановка строк в зависимости от условия - PullRequest
0 голосов
/ 27 декабря 2018

Я хочу отфильтровать мой фрейм данных.

Мой фрейм данных

  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

Выходной фрейм данных

  Col1    col2
     A  event1
     B  event1
     B  event3

Он должен возвращать строки перед событием2 для каждой группы.пока я пробовал

df.groupby('col1').apply(lambda x :x[0:x[x['col2'] == 'event2'].index[0]])

Но он не возвращает требуемые строки.

1 Ответ

0 голосов
/ 27 декабря 2018

Мы можем сделать это с помощью 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...