2013-04-19 4 views
1

Для примера нижеГруппировка и заказ на одном уровне, показывая рассчитывает на другом

import pandas as pd 
data = {'state': ['Ohio', 'Ohio', 'Ohio', 'Ohio', 'Ohio', 
        'Nevada', 'Nevada','Nevada','Nevada'], 
     'year': [2000, 2000, 2000, 2002, 2002, 
       2002, 2002, 2002, 2002], 
     'pop': [1, 1, 1, 1, 1, 1, 1, 1, 1]} 
df = pd.DataFrame(data) 

Выхода

pop state year 
0 1 Ohio 2000 
1 1 Ohio 2000 
2 1 Ohio 2000 
3 1 Ohio 2002 
4 1 Ohio 2002 
5 1 Nevada 2002 
6 1 Nevada 2002 
7 1 Nevada 2002 
8 1 Nevada 2002 

мне нужна сумма на поп, для каждого состояния + года комбинации, однако, сортировка должна основываться на государственном уровне.

Таким образом, мне нужны подсчеты в пределах подсчетов, с заказом на первом уровне. Выход как

state year sum 
    Ohio 2000 3 
     2002 2 
    Nev. 2002 4 

Как вы видите, Огайо находится на вершине, потому что с суммой 5 общая группа имеет больше деталей.

Дисплей является ключевым, я хотел бы показать штат Огайо только один раз.

Я считаю, что мне нужно использовать иерархические индексы на Pandas, однако я не мог определить точный синтаксис. Может ли использовать стек/нестак?

+1

Что случилось с Nevada 2001? Не могли бы вы отредактировать, чтобы включить именно то, что вы хотите? – DSM

ответ

4

stack() и unstack()может помощь, да плюс reindex():

In [11]: res = df.groupby(['state', 'year']).sum() 

In [12]: res 
Out[12]: 
      pop 
state year  
Nevada 2001 1 
     2002 3 
Ohio 2000 3 
     2002 2 

In [13]: st = np.sort(df.groupby('state')['pop'].sum())[::-1] 

In [14]: st 
Out[14]: 
state 
Ohio  5 
Nevada 4 
Name: pop 

In [15]: res.unstack().reindex(st.index).stack() 
Out[15]: 
      pop 
state year  
Ohio 2000 3 
     2002 2 
Nevada 2001 1 
     2002 3 

хотя я не уверен, если это самое элегантное решение. Я дал бы pandas мастерам кун-фу, чтобы сказать их слова мудрости.

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