Найдите наибольшее значение в нескольких группах в python

#python #pandas #dataframe #group-by

Вопрос:

Я пытаюсь найти самую высокую зарплату в течение каждого десятилетия для каждого данного имени. Ниже приведен мой пример набора данных и строка кода

 | Bins  | Name | Salary |
|-------|------|--------|
| 1990s | Ron  | 8000   |
| 1990s | Ron  | 8500   |
| 2000s | Hary | 7000   |
| 1980s | Ron  | 6800   |
| 2010s | John | 10000  |
| 2010s | John | 21000  |

df.sort_values(by='Salary', ascending=False).groupby('Bins').reset_index()
 

Но я продолжаю получать сообщение об ошибке: «необходимо последовательно переписать столбец, чтобы применить ключевую функцию».

Мой желаемый результат должен выглядеть следующим образом:

 | Bins  | Name | Salary |
|-------|------|--------|
| 1980s | Ron  | 6800   |
| 1990s | Ron  | 8500   |
| 2000s | Hary | 7000   |
| 2010s | John | 21000  |
 

Комментарии:

1. Дайте мне знать, работает ли мое решение для вас или нуждается в какой-либо доработке. Спасибо!

Ответ №1:

Это должно сработать:

 df.groupby('Bins').max().reset_index()
 

Комментарии:

1. Я все еще получаю сообщение об ошибке «Добавить ключ к исключениям».

Ответ №2:

Вы можете группировать ['Bins', 'Name'] и использовать GroupBy.first() , чтобы получить наибольшее значение в группе (поскольку вы отсортировали значения в порядке убывания, первой записью в группе является запись с наибольшим значением):

 df.sort_values(by='Salary', ascending=False).groupby(['Bins', 'Name']).first().reset_index()
 

Результат:

     Bins  Name  Salary
0  1980s   Ron    6800
1  1990s   Ron    8500
2  2000s  Hary    7000
3  2010s  John   21000
 

Другой способ сделать это — сгруппировать по ['Bins', 'Name'] и использовать GroupBy.max()

 df.groupby(['Bins', 'Name'], as_index=False)['Salary'].max()
 

Тот же результат.