Получить строку, соответствующую максимуму в пандах GroupBy - PullRequest
0 голосов
/ 23 января 2019

Простой DataFrame:

df = pd.DataFrame({'A': [1,1,2,2], 'B': [0,1,2,3], 'C': ['a','b','c','d']})
df
   A  B  C
0  1  0  a
1  1  1  b
2  2  2  c
3  2  3  d

Я хочу, чтобы для каждого значения (groupby) столбца A получалось значение столбца C, для которого столбец B является максимальным. Например, для группы 1 столбца A максимум столбца B равен 1, поэтому я хочу получить значение «b» столбца C:

   A  C
0  1  b
1  2  d

Нет необходимости предполагать, что столбец B отсортирован, производительность имеет высший приоритет, а затем элегантность.

Ответы [ 4 ]

0 голосов
/ 23 января 2019

Аналогично решению @Jondiedoop, но избегает apply:

u = df.groupby('A')['B'].idxmax()

df.loc[u, ['A', 'C']].reset_index(drop=1)

   A  C
0  1  b
1  2  d
0 голосов
/ 23 января 2019

Проверка с sort_values + drop_duplicates

df.sort_values('B').drop_duplicates(['A'],keep='last')
Out[127]: 
   A  B  C
1  1  1  b
3  2  3  d
0 голосов
/ 23 января 2019

Вот немного веселья с groupby и nlargest:

(df.set_index('C')
   .groupby('A')['B']
   .nlargest(1)
   .index
   .to_frame()
   .reset_index(drop=True))

   A  C
0  1  b
1  2  d

Или sort_values, groupby и last:

df.sort_values('B').groupby('A')['C'].last().reset_index()

   A  C
0  1  b
1  2  d
0 голосов
/ 23 января 2019
df.groupby('A').apply(lambda x: x.loc[x['B'].idxmax(), 'C'])
#    A
#1    b
#2    d

Используйте idxmax, чтобы найти индекс, где B является максимальным, затем выберите столбец C в этой группе (используя лямбда-функцию

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...