Python Группировка по нескольким столбцам и сохранение других столбцов - PullRequest
0 голосов
/ 04 августа 2020

У меня есть таблица, которая выглядит следующим образом:

City_code     City_name     Site_code      Site_capacity
AAA100      City_A          Site001         300
AAA100      City_A          Site002         600
AAA100      City_A          Site003         500
AAA200      City_B          Site004         350
AAA200      City_B          Site005         250
AAA300      City_C          Site006         800
AAA300      City_C          Site007         150
AAA300      City_C          Site008         450
AAA400      City_D          Site009         300
AAA400      City_D          Site0010        400

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

I попробовали следующий код:

df.groupby(['City_code', 'City_name'])['Site_capacity'].max()

Это результат, который он генерирует:

City_code     City_name     
AAA100      City_A          600
AAA200      City_B          350
AAA300      City_C          800
AAA400      City_D          400

Как мне создать какой-то вывод, который выглядит так?

City_code     City_name     Site_code      Site_capacity
AAA100      City_A          Site002         600
AAA200      City_B          Site004         350
AAA300      City_C          Site006         800
AAA400      City_D          Site0010        400

Ответы [ 3 ]

3 голосов
/ 04 августа 2020

Мы можем sort_values + drop_duplicates

s = df.sort_values('Site_capacity').drop_duplicates(['City_code', 'City_name'],keep='last')
Out[334]: 
  City_code City_name Site_code  Site_capacity
3    AAA200    City_B   Site004            350
9    AAA400    City_D  Site0010            400
1    AAA100    City_A   Site002            600
5    AAA300    City_C   Site006            800
1 голос
/ 04 августа 2020

попробуйте idxmax() и .loc

print(df.loc[df.groupby(['City_code', 'City_name'])['Site_capacity'].idxmax()])

  City_code City_name Site_code  Site_capacity
1    AAA100    City_A   Site002            600
3    AAA200    City_B   Site004            350
5    AAA300    City_C   Site006            800
9    AAA400    City_D  Site0010            400
0 голосов
/ 04 августа 2020

Попробуйте следующее:

df.sort_values(by=['City_name','Site_capacity'], inplace=True,ascending = (True, False)) 
df = df.drop_duplicates('City_name', keep='first')
print(df)

Результат:

  City_code City_name Site_code  Site_capacity
  AAA100    City_A    Site002    600
  AAA200    City_B    Site004    350
  AAA300    City_C    Site006    800
  AAA400    City_D    Site0010   400

Или, если вы хотите сохранить наименьшее значение.

df = df.drop_duplicates('City_name', keep='last')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...