假设我有一个数据框 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
from 结果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
我的理解是,您正在寻找按中位数排序的组。
如果是这种情况,您可以使用:
df.groupby(by='A')['B'].median().sort_values(ascending=False).index