python - 如何将嵌套字典转换为 pandas 数据框?

标签 python pandas dataframe

我有一个以下格式的字典“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

最好的方法是什么?

最佳答案

考虑字典理解来构建带有元组键的字典。然后,使用 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

关于python - 如何将嵌套字典转换为 pandas 数据框?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40638542/

相关文章:

python - 使用 **kwargs 初始化类是否存在安全问题?

Pandas Series 应用函数返回多行并向索引添加第二级

python - 查找与谓词匹配的序列中的第一个元素

Python C++ API : How to retrieve lineno attribute of NameError

python - 线图不显示轴中的所有日期

python - 按特定顺序在 Pandas 中取消堆叠 Dataframe

python - 如何从多个数据框列中制作单独的列表?

python - 如何从其他两列之间的列中获取数据框的行?

python - 从三个网页获取 Json 对象并将其写入文件中?

python - 映射同一列的两个值时出现问题