Вы можете использовать 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
EDIT
Если вы хотите использовать порядок сортировки, основанный на медиане вы можете добавить средний столбец обратно к orig 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
группы являются альфа отсортировано по умолчанию. Вы можете не сортировать, как этот 'df.groupby ('A', sort = False), что приводит к немного лучшей производительности. – Alexander
И нет способа получить группы, отсортированные по-разному? Я готовлю boxplot здесь, поэтому я хочу иметь одну группу в поле и все же хочу изменить положение ящиков на оси x (именно, я хочу отсортировать их по значению, указанному в этом столбце B) – brina
Это означает, что вы сортируете по значениям, как показано в @EdChum ниже. – Alexander