2017-02-10 2 views
1

Скажем, у меня есть следующий dataframeПанды мульти индекс dataframe к вложенной dictionarry

df = pd.DataFrame({0: {('A', 'a'): 1, ('A', 'b'): 6, ('B', 'a'): 2, ('B', 'b'): 7}, 
1: {('A', 'a'): 2, ('A', 'b'): 7, ('B', 'a'): 3, ('B', 'b'): 8}, 
2: {('A', 'a'): 3, ('A', 'b'): 8, ('B', 'a'): 4, ('B', 'b'): 9}, 
3: {('A', 'a'): 4, ('A', 'b'): 9, ('B', 'a'): 5, ('B', 'b'): 1}, 
4: {('A', 'a'): 5, ('A', 'b'): 1, ('B', 'a'): 6, ('B', 'b'): 2}}) 

, который выглядит следующим образом:

 0 1 2 3 4 
A a 1 2 3 4 5 
    b 6 7 8 9 1 
B a 2 3 4 5 6 
    b 7 8 9 1 2 

Когда я преобразовать это в словарь с помощью to_dict (независимо от укладки, Расшахтовочная), Я получаю словарь, ключи которого являются кортежами:

df.transpose().to_dict() 

{('A', 'a'): {0: 1, 1: 2, 2: 3, 3: 4, 4: 5}, 
('A', 'b'): {0: 6, 1: 7, 2: 8, 3: 9, 4: 1}, 
('B', 'a'): {0: 2, 1: 3, 2: 4, 3: 5, 4: 6}, 
('B', 'b'): {0: 7, 1: 8, 2: 9, 3: 1, 4: 2}} 

То, что я бы хотел, Заинтересованный ДИКТ так:

{'A':{'a': {0: 1, 1:2, 2:3, 3:4, 4:5}, 'b':{0:6, 1:7, 2:8, 3:9,4:1}... 

ответ

2

Вы можете использовать словарь понимание перебирать внешние уровни (значения «A» и «B») и использовать метод xs нарезать кадр этих уровней.

{level: df.xs(level).to_dict('index') for level in df.index.levels[0]} 

{'A': {'a': {0: 1, 1: 2, 2: 3, 3: 4, 4: 5}, 
    'b': {0: 6, 1: 7, 2: 8, 3: 9, 4: 1}}, 
'B': {'a': {0: 2, 1: 3, 2: 4, 3: 5, 4: 6}, 
    'b': {0: 7, 1: 8, 2: 9, 3: 1, 4: 2}}} 
+0

Никогда не знал о методе xs. Прекрасно работает! Спасибо! – parasu

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