如何将嵌套字典转换为熊猫数据框?
问题描述:
我在这个格式的词典 “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
什么是做到这一点的最好方法是什么?
答
考虑使用元组键来构建字典的字典理解。然后,使用熊猫'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
这个重复吗? http://stackoverflow.com/questions/13575090/construct-pandas-dataframe-from-items-in-nested-dictionary – JohnE
@JohnE谢谢!我会检查出来的。 –
@JohnE,不是一个确切的副本,我试过那个,虽然它变得非常接近,但列仍然需要排序,但出色的建议! – davedwards