假设我有一个数据框df并使用groupby。我如何分类这些组?我希望在B列中的中位数最高的是中位数最低的那个。 我知道如何位数排序:如何根据聚合对大熊猫组进行排序
df.groupby(by='A')['B'].median().sort_values(ascending=False)
但我怎么竟组(不是他们的中位数)排序?
假设我有一个数据框df并使用groupby。我如何分类这些组?我希望在B列中的中位数最高的是中位数最低的那个。 我知道如何位数排序:如何根据聚合对大熊猫组进行排序
df.groupby(by='A')['B'].median().sort_values(ascending=False)
但我怎么竟组(不是他们的中位数)排序?
可以使用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
编辑
如果你想使用基于中值的排序顺序,您可以添加位数列回到原始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
groups are alpha默认排序。你可以选择不要像这样排序'df.groupby('A',sort = False)',这会使性能稍微好一些。 – Alexander
并且没有办法让组排序不同?我在这里准备一个boxplot,所以我想每个box都有一个组,然后我想要改变x轴上的box的位置(确切地说,我想按照这个列中给出的'important'来排序它们) – brina
这意味着您按值进行排序,如下面的@EdChum所示。 – Alexander