2017-02-15 5 views
3

Я пытаюсь сортировать данные (Pandas) после группировки и агрегирования, и я застрял. Мои данные:Python Pandas сортировка по группам и агрегатам

data = {'from_year': [2010, 2011, 2012, 2011, 2012, 2010, 2011, 2012], 
    'name': ['John', 'John1', 'John', 'John', 'John4', 'John', 'John1', 'John6'], 
    'out_days': [11, 8, 10, 15, 11, 6, 10, 4]} 
persons = pd.DataFrame(data, columns=["from_year", "name", "out_days"]) 

days_off_yearly = persons.groupby(["from_year", "name"]).agg({"out_days": [np.sum]}) 

print(days_off_yearly) 

После этого я мои данные сортируются:

   out_days 
        sum 
from_year name   
2010  John  17 
2011  John  15 
      John1  18 
2012  John  10 
      John4  11 
      John6  4 

Я хочу, чтобы отсортировать мои данные по FROM_YEAR и out_days суммы и ожидающей данных быть:

   out_days 
        sum 
from_year name   
2012  John4  11 
      John  10 
      John6  4  
2011  John1  18 
      John  15 
2010  John  17 

I я пытаюсь

print(days_off_yearly.sort_values(["from_year", ("out_days", "sum")], ascending=False).head(10)) 

Но получение KeyError: 'from_year'.

Любая помощь приветствуется.

ответ

5

Вы можете использовать sort_values, но первый reset_index, а затем set_index:

#simplier aggregation 
days_off_yearly = persons.groupby(["from_year", "name"])['out_days'].sum() 
print(days_off_yearly) 
from_year name 
2010  John  17 
2011  John  15 
      John1 18 
2012  John  10 
      John4 11 
      John6  4 
Name: out_days, dtype: int64 

print (days_off_yearly.reset_index() 
         .sort_values(['from_year','out_days'],ascending=False) 
         .set_index(['from_year','name'])) 
       out_days 
from_year name   
2012  John4  11 
      John   10 
      John6   4 
2011  John1  18 
      John   15 
2010  John   17