1

假设我有一个数据框 df 并在其上使用了 groupby 。如何对这些组进行排序?我希望首先在 B 列中具有最高中位数的组,最后是中位数最低的组。我知道如何对中位数进行排序:

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

但是我将如何对这些组进行实际排序(而不是他们的中位数)?

4

2 回答 2

1

您可以使用indexfrom 结果sort_values来索引组:

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
于 2016-05-19T13:11:33.593 回答
0

我的理解是,您正在寻找按中位数排序的组。

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

df.groupby(by='A')['B'].median().sort_values(ascending=False).index
于 2018-03-30T19:13:18.180 回答