熊猫根据其内容以任意条件对古比组进行排序

时间:2019-08-05 08:47:20

标签: pandas pandas-groupby

好吧,这太荒谬了……我花了太多时间在一些琐碎的事情上。

我想按列对数据框进行分组,然后按某种条件(在我的情况下,对组中某些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包含字符串)。

1 个答案:

答案 0 :(得分:1)

我认为您可能需要为某些组使用相同的最大值,将GroupBy.transformmax用于新列,然后按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