2016-05-19 102 views
1

假设我有一个数据框df并使用groupby。我如何分类这些组?我希望在B列中的中位数最高的是中位数最低的那个。 我知道如何位数排序:如何根据聚合对大熊猫组进行排序

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

但我怎么竟组(不是他们的中位数)排序?

+0

groups are alpha默认排序。你可以选择不要像这样排序'df.groupby('A',sort = False)',这会使性能稍微好一些。 – Alexander

+0

并且没有办法让组排序不同?我在这里准备一个boxplot,所以我想每个box都有一个组,然后我想要改变x轴上的box的位置(确切地说,我想按照这个列中给出的'important'来排序它们) – brina

+0

这意味着您按值进行排序,如下面的@EdChum所示。 – Alexander

回答

0

可以使用indexsort_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 

编辑

如果你想使用基于中值的排序顺序,您可以添加位数列回到原始df使用transform然后对原始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 
+0

谢谢,这指向了正确的方向。 然而,它最终并没有回答我的完整问题,(out [135])它仍然是按照组排序的中位数。即我想做'df.groupby('group')[order.index]'来排序组(及其所有值),但这对我不起作用('未找到列')。有什么建议么? – brina

+0

@brina建议:添加一个具有组中值的列,按它排序'df',然后再用'sort = False'分组。 – ptrj

相关问题