Преобразование группы pandas по объекту в мультииндексированный Dataframe

Если у меня есть следующий Dataframe

>>> df = pd.DataFrame({'Name': ['Bob'] * 3 + ['Alice'] * 3, \
'Destination': ['Athens', 'Rome'] * 3, 'Length': np.random.randint(1, 6, 6)}) 
>>> df    
  Destination  Length   Name
0      Athens       3    Bob
1        Rome       5    Bob
2      Athens       2    Bob
3        Rome       1  Alice
4      Athens       3  Alice
5        Rome       5  Alice

Я могу выбрать по имени и месту назначения...

>>> grouped = df.groupby(['Name', 'Destination'])
>>> for nm, gp in grouped:
>>>     print nm
>>>     print gp
('Alice', 'Athens')
  Destination  Length   Name
4      Athens       3  Alice
('Alice', 'Rome')
  Destination  Length   Name
3        Rome       1  Alice
5        Rome       5  Alice
('Bob', 'Athens')
  Destination  Length Name
0      Athens       3  Bob
2      Athens       2  Bob
('Bob', 'Rome')
  Destination  Length Name
1        Rome       5  Bob

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

                Length
Alice   Athens       3
        Rome         1
        Rome         5
Bob     Athens       3
        Athens       2
        Rome         5

Кажется, должен быть способ сделать что-то вроде Dataframe(grouped), чтобы получить мой мультииндексированный Dataframe, но вместо этого я получаю PandasError («Конструктор DataFrame вызван неправильно!»).

Как проще всего это получить? Кроме того, кто-нибудь знает, будет ли когда-нибудь возможность передать объект groupby конструктору, или я просто делаю это неправильно?

Спасибо


person beardc    schedule 13.01.2013    source источник


Ответы (1)


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

In [2]: df.set_index(['Name', 'Destination'])
Out[2]: 
                   Length
Name  Destination        
Bob   Athens            3
      Rome              5
      Athens            2
Alice Rome              1
      Athens            3
      Rome              5
person Garrett    schedule 13.01.2013