Pandas 如何基于聚合对组进行排序

Pandas 如何基于聚合对组进行排序,pandas,pandas-groupby,Pandas,Pandas Groupby,假设我有一个数据帧df,并在上面使用了groupby。如何对这些组进行排序?我想先让B列中位数最高的组,最后是中位数最低的组。 我知道如何对中值进行排序: df.groupby(by='A')['B'].median().sort_values(ascending=False) 但是我实际上如何对组进行排序(而不是中位数)?您可以使用排序值的结果中的索引对组进行索引: In [118]: df = pd.DataFrame(np.random.randn(5,3), columns=list(

假设我有一个数据帧df,并在上面使用了groupby。如何对这些组进行排序?我想先让B列中位数最高的组,最后是中位数最低的组。 我知道如何对中值进行排序:

df.groupby(by='A')['B'].median().sort_values(ascending=False)

但是我实际上如何对组进行排序(而不是中位数)?

您可以使用
排序值的结果中的
索引对组进行索引:

In [118]:
df = pd.DataFrame(np.random.randn(5,3), columns=list('abc'))
df['group'] = list('aabcc')
df

Out[118]:
          a         b         c group
0  3.260645 -0.636861  0.183312     a
1 -0.409939  1.915902 -2.426166     a
2 -0.522152  1.621288  0.225874     b
3  0.576484  0.499148 -1.037899     c
4  0.626081  0.040262 -1.679669     c

In [128]:    
gp = df.groupby('group')['a'].median()
gp

Out[128]:
group
a    1.425353
b   -0.522152
c    0.601282
Name: a, dtype: float64

In [134]:
order = gp.sort_values(ascending=False)
order

Out[134]:
group
a    1.425353
c    0.601282
b   -0.522152
Name: a, dtype: float64

In [135]:    
gp[order.index]

Out[135]:
group
a    1.425353
c    0.601282
b   -0.522152
Name: a, dtype: float64
编辑

如果要使用基于中值的排序顺序,可以使用
transform
将中值列添加回原始df,然后对原始df进行排序:

In [7]:
df['median'] = df.groupby('group')['a'].transform('median')
df

Out[7]:
          a         b         c group    median
0  3.260645 -0.636861  0.183312     a  1.425353
1 -0.409939  1.915902 -2.426166     a  1.425353
2 -0.522152  1.621288  0.225874     b -0.522152
3  0.576484  0.499148 -1.037899     c  0.601282
4  0.626081  0.040262 -1.679669     c  0.601282

In [9]:    
df.loc[df['median'].sort_values(ascending=False).index]

Out[9]:
          a         b         c group    median
1 -0.409939  1.915902 -2.426166     a  1.425353
0  3.260645 -0.636861  0.183312     a  1.425353
4  0.626081  0.040262 -1.679669     c  0.601282
3  0.576484  0.499148 -1.037899     c  0.601282
2 -0.522152  1.621288  0.225874     b -0.522152

我的理解是,您正在寻找按中间值排序的组

如果是这种情况,您可以使用:

df.groupby(by='A')['B'].median().sort_values(ascending=False).index

谢谢,这是正确的方向。然而,它并没有回答我的完整问题,因为最后,(out[135])仍然是中位数被分类,而不是组。也就是说,我想做一些类似于
df.groupby('group')[order.index]
的事情来对组(及其所有值)进行排序,但这对我不起作用('Columns not found')。有什么建议吗?@brina Suggestion:添加一个带有组中位数的列,按其排序
df
,然后使用
sort=False
再次分组。默认情况下,组是alpha排序的。您可以选择不这样排序
df.groupby('A',sort=False)
,这样性能会稍微好一点。而且没有办法对组进行不同的排序吗?我在这里准备一个箱线图,所以我想每个箱子有一组,但我仍然想改变箱子在x轴上的位置(确切地说,我想按B列中给出的“重要性”对它们进行排序),这意味着你是按值排序的,如下面的@EdChum所示。你也读过我对他的演示的评论吗?我想像他那样对各组进行排序,但我仍然希望每个组中都包含所有值,而不仅仅是中位数。我不知道这是怎么可能的。谢谢你回答这个问题,但考虑到我最初的问题已经两年多了,我自己也不记得细节了(也不记得我现在在哪里有可以用来尝试这个的代码)…我明白了。我给出回复的原因是为其他面临类似问题的人提供一个解决方案——比如我,几天前!