我们可以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]