2016-07-29 4 views
0

После группового заказа порядок вывода группы предварительно определен. В следующем случае порядок: A, AAA, B, BBB.Определили порядок вывода groupby?

Есть ли способ настроить этот заказ? Я хочу заказать AAA, A, BBB, B. Возможно, я захочу и в других заказах.

import pandas as pd 
import matplotlib as mpl 
import matplotlib.pyplot as plt 
%matplotlib inline 
data=pd.DataFrame({'Rating':['A','AAA','B','BBB','A','AAA','B','BBB'], 
        'Score':[2,4,5,6,2,4,5,6,]}) 
t=data.groupby('Rating', sort=False)['Score'].mean() 
t 
Rating 
A  2 
AAA 4 
B  5 
BBB 6 
Name: Score, dtype: int64 

ответ

2

Вы не можете изменить порядок возвращенное GroupBy/среднее (за исключением того, что возможно с помощью параметра sort). Тем не менее, легко изменить порядок после факта использования reindex:

In [24]: data.groupby('Rating', sort=False)['Score'].mean().reindex(['AAA', 'A', 'BBB', 'B']) 
Out[24]: 
Rating 
AAA 4 
A  2 
BBB 6 
B  5 
Name: Score, dtype: int64 

В качестве альтернативы, вы можете контролировать порядок возвращенное groupby/mean путем изменения Ratings к Categorical:

import pandas as pd 

data = pd.DataFrame({'Rating':['A','AAA','B','BBB','A','AAA','B','BBB'], 
        'Score':[2,4,5,6,2,4,5,6,]}) 
data['Rating'] = pd.Categorical(data['Rating'], categories=['AAA','A','BBB','B'], 
           ordered=True) 
result = data.groupby('Rating', sort=False)['Score'].mean() 
print(result) 

дает

Rating 
AAA 4 
A  2 
BBB 6 
B  5 
Name: Score, dtype: int64 
0

sort=False просто означает, что это не гарантированно будет отсортирован (можно заказать). Мое воспоминание о том, что это в «видимом порядке», но опять же это не гарантировано.

Для сортировки вывода в GroupBy, просто делать вид после (индексом):

In [11]: t.sort_index() 
Out[11]: 
Rating 
A  2 
AAA 4 
B  5 
BBB 6 
Name: Score, dtype: int64 
+0

Хммм, я вижу, что это не сортировка в «AAA, A, BBB, B», но я не уверен, как вы можете это сделать без переиндексации вручную (например, ответ @ unutbu). –

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