好吧,这太荒谬了……我花了太多时间在一些琐碎的事情上。
我想按列对数据框进行分组,然后按某种条件(在我的情况下,对组中某些B列的最大值)对组(不在组内)进行排序。
我期望遵循以下原则:
df.groupby('A').sort_index(lambda group_content: group_content.B.max())
我也尝试过:
groups = df.groupby('A')
maxx = gg['B'].max()
groups.sort_index(...)
但是,当然,按对象分组没有sort_index
。
编辑:
我最终使用了(几乎)@jezrael建议的解决方案
df['max'] = df.groupby('A')['B'].transform('max')
df = df.sort_values(['max', 'B'], ascending=True).drop('max', axis=1)
groups = df.groupby('A', sort=False)
我必须将ascending=True
添加到sort_values
,但重要的是将sort=False
添加到groupby
,否则,我将使组排序lex( A包含字符串)。
答案 0 :(得分:1)
我认为您可能需要为某些组使用相同的最大值,将GroupBy.transform
和max
用于新列,然后按DataFrame.sort_values
进行排序:
df = pd.DataFrame({
'A':list('aaabcc'),
'B':[7,8,9,100,20,30]
})
df['max'] = df.groupby('A')['B'].transform('max')
df = df.sort_values(['max','A'])
print (df)
A B max
0 a 7 9
1 a 8 9
2 a 9 9
4 c 20 30
5 c 30 30
3 b 100 100
如果总是最大值是唯一的,请使用Series.argsort
:
s = df.groupby('A')['B'].transform('max')
df = df.iloc[s.argsort()]
print (df)
A B
0 a 7
1 a 8
2 a 9
4 c 20
5 c 30
3 b 100