2016-05-19 2 views
1

Предположим, у меня есть dataframe df и используется groupby на нем. Как я могу сортировать эти группы? Я хотел бы сначала иметь группу с наивысшей средой в столбце B, с самой последней срединной средой. Я знаю, как получить средний отсортирован:как сортировать группы pandas на основе совокупности

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

Но как бы я на самом деле сортировать группы (не их срединные)?

+0

группы являются альфа отсортировано по умолчанию. Вы можете не сортировать, как этот 'df.groupby ('A', sort = False), что приводит к немного лучшей производительности. – Alexander

+0

И нет способа получить группы, отсортированные по-разному? Я готовлю boxplot здесь, поэтому я хочу иметь одну группу в поле и все же хочу изменить положение ящиков на оси x (именно, я хочу отсортировать их по значению, указанному в этом столбце B) – brina

+0

Это означает, что вы сортируете по значениям, как показано в @EdChum ниже. – Alexander

ответ

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 

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 
+0

Спасибо, это указывает в правильном направлении. Однако он не отвечает на мой полный вопрос, как в конце, (из [135]) он по-прежнему является медианом, который сортируется не по группам. То есть Я хотел бы сделать что-то вроде 'df.groupby ('group') [order.index]' для сортировки групп (и всех их значений), но это не работает для меня («Столбцы не найдены»). Какие-либо предложения? – brina

+0

@brina Предложение: добавить столбец с медианой группы, отсортировать его 'df', а затем снова сгруппировать с помощью' sort = False'. – ptrj

Смежные вопросы