2013-07-11 73 views
3

我有一個嵌套的字典對象我想轉換成多指標數據框架,我該如何實現它。字典關鍵字到多指標

例如

t['a'] = dict() 
t['b'] = dict() 
t['a']['1'] = pd.DataFrame([ [1.0,2.0],[3.0,4.0] ]) 
t['a']['2'] = pd.DataFrame([ [5.0,6.0],[7.0,8.0] ]) 
t['b']['1'] = pd.DataFrame([ [1.0,2.0],[3.0,4.0] ]) 
t['b']['2'] = pd.DataFrame([ [5.0,6.0],[7.0,8.0] ]) 

所以我想轉換成一個數據幀索引像

a 
    1  0  1 
     0 1.0 2.0 
     1 3.0 4.0 
    2 
     0 5.0 6.0 
     1 7.0 8.0 
b 
    1 
     0 1.0 2.0 
     1 3.0 4.0 
    2 
     0 5.0 6.0 
     1 7.0 8.0 

我認爲我可以使用MultiIndex(levels=[ ['a','b'], [1,2] ]),但我不知道如何構建標籤。我也不知道如何傳遞字典值作爲數據數組。

回答

1

幀的字典形成面板,to_frame蛻變爲2級指標, 你想要的通過CONCAT表單時的字典

從理論上講,你可以做這樣的事情,如果你遞歸下降的附加級別需要更多的水平,但這會打擊大腦。要得到您的確切輸出,您可以執行sortlevel

In [36]: concat(dict([ (k,Panel(v).to_frame()) for k,v in t.items() ]) , names= ['level']) 
Out[36]: 
        1 2 
level major minor  
a  0  0  1 5 
      1  2 6 
     1  0  3 7 
      1  4 8 
b  0  0  1 5 
      1  2 6 
     1  0  3 7 
      1  4 8 
+0

不幸的是我有3個級別。我想出了這個'pd.concat(dict([(k,pd.concat(dict([(x,pd.Panel(y).to_frame())for x,y in v.items()])) )for k,v in t.items()])'但結果看起來不正確 – user2426361

+0

上面的輸出確實有3個級別命名:level,major,minor。我相信這就是你要求的 – Jeff

+0

sory,我的意思是我只給了2級(字典詞典)來說明這種情況,你的解決方案在這種情況下效果很好,但實際上我有3個級別的字典,即't'''''[1] ['f'] = pd.DataFrame(。 ..)'所以我把你的解決方案擴展了一個級別,但我的理解是錯誤的,因爲結果看起來不正確。 – user2426361

4

我覺得最簡單的方法,從一個元組列表到一個多指標,如所描述here。使用

你的例子,我們有一個嵌套的字典一樣

In [25]: t 
Out[25]: 
{'a': {'1': 0 1 
0 1 2 
1 3 4, '2': 0 1 
0 5 6 
1 7 8}, 
'b': {'1': 0 1 
0 1 2 
1 3 4, '2': 0 1 
0 5 6 
1 7 8}} 

如果你想使你的頭有點兒疼,你可以使用這個列表理解:

In [50]: tuples = [(x, y, z) for x in t for y in t[x] for z in t[x][y]] 

In [51]: tuples 
Out[51]: 
[('a', '1', 0), 
('a', '1', 1), 
('a', '2', 0), 
('a', '2', 1), 
('b', '1', 0), 
('b', '1', 1), 
('b', '2', 0), 
('b', '2', 1)] 

然後idx = pd.MultiIndex.from_tuples(tuples)會作爲您的索引工作。

獲取解壓縮的值有點多。

編輯:你真的應該只是去傑夫的答案,但對於完整性:

In [114]: df = pd.concat([x for z in t for x in t[z].values()]) 

In [115]: df.index = idx 

In [118]: df 
Out[118]: 
     0 1 
a 1 0 1 2 
    1 3 4 
    2 0 5 6 
    1 7 8 
b 1 0 1 2 
    1 3 4 
    2 0 5 6 
    1 7 8