2016-11-16 225 views
2

我在這個格式的詞典 「my_dict」:如何將嵌套字典轉換爲熊貓數據框?

{'l1':{'c1': {'a': 0, 'b': 1, 'c': 2}, 
     'c2': {'a': 3, 'b': 4, 'c': 5}}, 
'l2':{'c1': {'a': 0, 'b': 1, 'c': 2}, 
     'c2': {'a': 3, 'b': 4, 'c': 5}} 
} 

目前,我使用pd.DataFrame.from_dict(my_dict, orient='index'),並得到這樣的DF:

       c2       c1 
l1 {u'a': 3, u'c': 5, u'b': 4} {u'a': 0, u'c': 2, u'b': 1} 
l2 {u'a': 3, u'c': 5, u'b': 4} {u'a': 0, u'c': 2, u'b': 1} 

不過,我要的是既L1/L2和c2/c3作爲索引,a/b/c作爲列。
事情是這樣的:

 a b c 
l1 c1 0 1 2 
    c2 3 4 5 
l2 c1 0 1 2 
    c2 3 4 5 

什麼是做到這一點的最好方法是什麼?

+0

這個重複嗎? http://stackoverflow.com/questions/13575090/construct-pandas-dataframe-from-items-in-nested-dictionary – JohnE

+0

@JohnE謝謝!我會檢查出來的。 –

+0

@JohnE,不是一個確切的副本,我試過那個,雖然它變得非常接近,但列仍然需要排序,但出色的建議! – davedwards

回答

3

考慮使用元組鍵來構建字典的字典理解。然後,使用熊貓'MultiIndex.from_tuples。在ast以下用於重建字符串中的原始字典(忽略結尾的步驟)。

import pandas as pd 
import ast 

origDict = ast.literal_eval(""" 
{'l1':{'c1': {'a': 0, 'b': 1, 'c': 2}, 
     'c2': {'a': 3, 'b': 4, 'c': 5}}, 
'l2':{'c1': {'a': 0, 'b': 1, 'c': 2}, 
     'c2': {'a': 3, 'b': 4, 'c': 5}} 
}""") 

# DICTIONARY COMPREHENSION 
newdict = {(k1, k2):v2 for k1,v1 in origDict.items() \ 
         for k2,v2 in origDict[k1].items()} 
print(newdict) 
# {('l1', 'c2'): {'c': 5, 'a': 3, 'b': 4}, 
# ('l2', 'c1'): {'c': 2, 'a': 0, 'b': 1}, 
# ('l1', 'c1'): {'c': 2, 'a': 0, 'b': 1}, 
# ('l2', 'c2'): {'c': 5, 'a': 3, 'b': 4}} 

# DATA FRAME ASSIGNMENT 
df = pd.DataFrame([newdict[i] for i in sorted(newdict)], 
        index=pd.MultiIndex.from_tuples([i for i in sorted(newdict.keys())]))  
print(df) 
#  a b c 
# l1 c1 0 1 2 
# c2 3 4 5 
# l2 c1 0 1 2 
# c2 3 4 5 
+0

太棒了!謝謝@Parfait!只是想知道爲什麼你使用ast.literal_eval? –

+1

太棒了!使用'ast.literal_eval'避免了重新定義字典,而是直接從字符串創建,就像您發佈的那樣。 – Parfait

相關問題