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

时间:2016-05-19 13:03:10

标签: pandas pandas-groupby

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

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

但是我如何对群体进行实际排序(而非中位数)?

2 个答案:

答案 0 :(得分:0)

您可以使用index结果中的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

答案 1 :(得分:0)

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

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

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