如何将嵌套字典转换为熊猫数据框?

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 可以避免重新定义您的字典,而是直接从字符串创建它,就像您发布的那样。

以上是关于如何将嵌套字典转换为熊猫数据框?的主要内容,如果未能解决你的问题,请参考以下文章

如何将包含元组列表的字典中的字典转换为熊猫数据框

如何将熊猫数据框中的嵌套逗号分隔列转换为Python中的特定格式

将字典的特定字典转换为熊猫数据框 - 熊猫 [重复]

将熊猫数据框转换为字典

如何将嵌套字典转换为数据框

将带有列表的字典转换为熊猫数据框