pandas: отбор строк с максимальным значением определенного столбца для каждого индекса

Рейтинг: 0Ответов: 2Опубликовано: 20.07.2023

Помогите, пожалуйста, в pandas создать сводную таблицу, содержащую для каждого индекса значения из всех столбцов, соответствующее максимальному значению из column1

Пример:

Создаем датафрейм:

df = pd.DataFrame({'index': ['A', 'A', 'B', 'B', 'C', 'C', 'C'],
                   'column1': [1, 2, 1, 2, 1, 2, 3],
                   'column2': [1, 2, 5, 4, 5, 6, 3],
                   'column3': [1, 2, 4, 10, 7, 5, 4]})

Из него надо получить:

         column2    column3
index         
A            2        2
B            4        10
C            3        4

Ответы

▲ 1

Это можно сделать, например, простой группировкой + методом idxmax:

res = df.loc[df.groupby(['index'])['column1'].idxmax()]

res:

  index  column1  column2  column3
1     A        2        2        2
3     B        2        4       10
6     C        3        3        4

можно еще явно указать нужные столбцы:

res = df.loc[df.groupby(['index'])['column1'].idxmax(), ["index", "column2", "column3"]]

res:

  index  column2  column3
1     A        2        2
3     B        4       10
6     C        3        4

Не забудьте, что в вашем примере "index" - это имя столбца, а не индекс датафрейма.

▲ 0

Cортируем фрейм по 'index', 'column1', удаляем дубликаты строк по ключу из столбца 'index', оставляя последнее вхождение, потом удаляем ненужный 'column1'

df = df.sort_values(['index', 'column1']).drop_duplicates('index', keep='last').drop('column1',axis=1)
  index  column2  column3
1     A        2        2
3     B        4       10
6     C        3        4

Примечание. Если важно сохранять порядок следования значений из столбца 'index', то данный вариант не годится, т.к. сортирует строки, меняя их порядок.