pandas фильтр строк на основе поиска максимума в столбце

Задача такая. Есть датафрейм:

df123 = pd.DataFrame({"A": ["1", "1", "1", "2", "2"],
                      "B": ["monday", "tuesday", "wednesday", "monday", "tuesday"],
                      "C": ["1", "2", "3", "2", "2"]})

Нужно для каждого уникального значения колонки А вывести строку с максимальным значением колонки С, при этом колонка В также должна показываться. Если одинаковых максимумов несколько, то нужно показать все сроки с одинаковыми максимумами (они будут отличаться по столбцу В) Т.е. на выходе должно быть:

Мне в голову приходит только

    df123.groupby('A', as_index = False)\
     .agg({'C' : 'max'})

Но тогда теряю колонку В. Чувствую, где-то на поверхности плавает решение, не могу сообразить.


Ответы (2 шт):

Автор решения: passant
df123.groupby(['A']).apply(lambda t: t[t.C==t.C.max()])

Результат:

     A          B  C
A                   
1 2  1  wednesday  3
2 3  2     monday  2
  4  2    tuesday  2

P.S. Из за жалоб на медленность работы провел эксперимент и с большим удивлением обнаружил, что результат можно немного ускорить за счет весьма незначительной переделки:

%timeit df123.groupby(['A']).apply(lambda t: t[t.C==t.C.max()])

1.85 ms ± 9.09 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

%timeit df123.groupby(['A']).apply(lambda t: t[t.C.values==t.C.values.max()]) 

1.62 ms ± 14.9 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

→ Ссылка
Автор решения: CrazyElf

Странно, что никто не вспомнил про merge:

pd.merge(df123, df123.groupby('A').agg({'C': 'max'}).reset_index(), on=('A','C'))

Вывод:

    A   B           C 
0   1   wednesday   3
1   2   monday      2
2   2   tuesday     2

Работает медленнее, чем решение с apply, но возможно в каких-то случаях это решение будет более универсальным.

→ Ссылка