如何将嵌套字典转换为熊猫数据框?
Posted
技术标签:
【中文标题】如何将嵌套字典转换为熊猫数据框?【英文标题】:How to convert a nested dictionary to pandas dataframe? 【发布时间】:2017-03-31 00:42:52 【问题描述】:我有一本这种格式的字典“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
最好的方法是什么?
【问题讨论】:
这个重复? ***.com/questions/13575090/… @JohnE 谢谢!我去看看。 @JohnE,不是完全相同的副本,我试过那个,虽然它非常接近,但列仍然需要排序,但很好的建议! 【参考方案1】:考虑使用字典推导来构建带有元组键的字典。然后,使用 pandas 的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
【讨论】:
太棒了!谢谢@Parfait!只是想知道您为什么使用 ast.literal_eval? 太棒了!使用ast.literal_eval
可以避免重新定义您的字典,而是直接从字符串创建它,就像您发布的那样。以上是关于如何将嵌套字典转换为熊猫数据框?的主要内容,如果未能解决你的问题,请参考以下文章