Мы можем sort
в первую очередь. Поскольку pd.unique
порядок сохранения, он находит 'key'
, упорядоченный по их наибольшему значению. Затем, установив индекс и используя .loc
, мы можем сгруппировать их все.
Пример данных
import pandas as pd
df = pd.DataFrame({'col': [1,2,3,4,5,6,7,8,9,10],
'key': list('abababcacb')})
Код
df = df.sort_values('col', ascending=False)
df = df.set_index('key').loc[df['key'].unique()].reset_index()
key col
0 b 10
1 b 6
2 b 4
3 b 2
4 c 9
5 c 7
6 a 8
7 a 5
8 a 3
9 a 1
Другой способ сделать то, что вы хотите, это создать вспомогательный столбец. Вы хотите отсортировать по максимальному значению 'col'
внутри группы, поэтому используйте transform
, чтобы передать результат в столбец помощника, по которому мы отсортировали, а затем отбросить.
df['key1'] = df.groupby('key')['col'].transform('max')
df = df.sort_values(['key1', 'col'], ascending=False).drop(columns='key1')
Если вы хотел использовать groupby
вы на самом деле просто используете его для получения местоположения индекса. Прямой реализацией было бы просто concat
групп, итерируя по объекту groupby:
df = pd.concat([gp for _,gp in df.sort_values('col', ascending=False).groupby('key', sort=False)])
Однако, поскольку вам просто нужно перестроить весь DataFranme, на самом деле нет необходимости разбивать его просто конкатить все обратно. Атрибут .groups
хранит индексы. Объедините их в цепочку и нарежьте оригинальный DataFrame
from itertools import chain
idx = chain.from_iterable(df.sort_values('col', ascending=False)
.groupby('key', sort=False)
.groups.values())
df = df.loc[idx]