как сохранить максимальный столбец в таблице groupby?

#python-3.x #pandas #pandas-groupby

Вопрос:

Я составил сводную таблицу, как показано ниже, используя функцию pandas groupby

Я ii
A Apple 3
банан 4
B собака 1
кошка 2
C Сеул 9
Токио 5

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

Я ii
A банан 4
B кошка 2
C Сеул 9

Спасибо.

Ответ №1:

Фрейм данных, используемый мной:

 df=pd.DataFrame({'II': {('A', 'apple'): 3,
  ('A', 'banana'): 4,
  ('B', 'dog'): 1,
  ('B', 'cat'): 2,
  ('C', 'seoul'): 9,
  ('C', 'tokyo'): 5}})
 

Попробуйте через sort_values() , reset_index() и drop_duplicates() :

 out=(df.sort_values('II',ascending=False)
   .reset_index()
   .drop_duplicates('level_0')
   .set_index('level_0')
   .rename_axis(index=None)
   .rename(columns={'level_1':'I'}))
 

или

 out=(df.reset_index()
       .sort_values('II',ascending=False)
       .groupby('level_0')
       .first()
       .rename(columns={'level_1':'I'})
       .rename_axis(index=None))
 

выход из out :

     I       II
C   seoul   9
A   banana  4
B   cat     2
 

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

1. спасибо за ваш ответ. однако это не работает для меня. не могли бы вы объяснить, какова роль «level_0»?

2. Спасибо. Я решил свою проблему,используя ваш ответ. out=df.значения сортировки («II», по возрастанию=False).reset_index().drop_duplicates(подмножество= «категория») * Я дал имя столбца индекса как » категория

3. @JihoonSeo обновленный ответ…. пожалуйста, посмотрите 🙂

4. @JihoonSeo когда вы используете reset_index() многоиндексированный фрейм данных, его уровень конъюнктивности становится столбцами, и они называются в соответствии с их level..so вот 'level_0' имя столбца, присвоенное 0-му уровню мультииндекса

5. хорошо, теперь я понимаю, какова роль «level_0». спасибо вам за ваш любезный ответ 🙂

Ответ №2:

Не уверен, что это самое элегантное решение, но если вы хотите, чтобы это работало с groupby объектом.

 # Creating the Dummy DataFrame
d = {
'Letter': ['A', 'A', 'B', 'B', 'C', 'C'], 'Word': ['apple', 'banana', 
    'dog', 'cat', 'seoul', 'tokyo'], 'II': [3, 4, 1, 2, 9, 5]
}
df = pd.DataFrame(data=d)

df_max = df.groupby('Letter')[['II']].agg('max')

df_max = df_max.merge(df, how='left', on='II') # merge the "Word" column back into df_max
 

Затем вы можете изменить порядок столбцов, если вам нужно, чтобы они располагались в определенном порядке.