#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
Затем вы можете изменить порядок столбцов, если вам нужно, чтобы они располагались в определенном порядке.