2016-06-30 2 views
2

У меня есть dataframe, который выглядит следующим образом:pandas: как отсортировать сгруппированные данные по средней сумме?

Speciality  Amount 
Greek   15 
Greek   16 
Italian  8 
Italian  11 
Italian  13 

Я теперь агрегируются среднее и рассчитывать для каждой специальности:

df_by_spec_count = df.groupby('Speciality').agg(['mean', 'count']) 

Теперь я хочу, чтобы напечатать 10 лучших специальностей с самым высоким средним ,

Я попытался это:

print df_by_spec_count.sort_values(by='count',ascending=False).head() 

Но я получаю исключение KeyError. Что я делаю не так?

ответ

1

Вы иерархические столбцы, так что вы должны передать кортеж, чтобы выбрать соответствующий уровень столбца для сортировки:

In [324]: 

df_by_spec_count.sort_values(by=('Amount','count'),ascending=False).head() 
Out[324]: 
       Amount  
       mean count 
Speciality     
Italian  10.666667  3 
Greek  15.500000  2 

Вы можете понять, почему, если вы посмотрите на оригинальный сгруппированных результат:

In[321]: 
df_by_spec_count 

Out[321]: 
       Amount  
       mean count 
Speciality     
Greek  15.500000  2 
Italian  10.666667  3 

In [325]: 
df_by_spec_count.columns 

Out[325]: 
MultiIndex(levels=[['Amount'], ['mean', 'count']], 
      labels=[[0, 0], [0, 1]]) 
2

Другим решением является удалить верхний уровень с помощью MultiIndex.droplevel:

df_by_spec_count = df.groupby('Speciality').agg(['mean', 'count']) 
df_by_spec_count.columns = df_by_spec_count.columns.droplevel(0) 
print (df_by_spec_count) 

       mean count 
Speciality     
Greek  15.500000  2 
Italian  10.666667  3 

print (df_by_spec_count.sort_values(by='count',ascending=False).head()) 
       mean count 
Speciality     
Italian  10.666667  3 
Greek  15.500000  2 

Но лучшим решением будет указать столбец Amount для объединения в groupby - получить нетMultiindex в колонках:

df_by_spec_count = df.groupby('Speciality')['Amount'].agg(['mean', 'count']) 
print (df_by_spec_count) 
       mean count 
Speciality     
Greek  15.500000  2 
Italian  10.666667  3 

print (df_by_spec_count.sort_values(by='count',ascending=False).head()) 
       mean count 
Speciality     
Italian  10.666667  3 
Greek  15.500000  2 
Смежные вопросы