首页 > 解决方案 > 从嵌套字典中获取熊猫数据框?

问题描述

我是 Python 新手,找了一段时间后,我还没有找到一个很好的答案来解决我的问题。我正在尝试从字典列表中创建一个 Pandas 数据框。

我的嵌套字典列表如下:

{'category_1': [{'a': '151',
   'b': '116',
   'c': '86'}],
 'category_2': [{'d': '201',
   'e': '211',
   'f': '252'},
  {'d': '-1',
   'e': '-9',
   'f': '-7'}],
 'category_3': {'g': 'Valid',
   'h': None,
   'i': False,
   'j': False},
 'category_4': {'k': None,
   'l': None,
   'm': None,
   'n': None}}

我的输出应该是

    a     b    c    d       e       f       g      h     i      j         k    l    m     n  
 0  151   116  86   201,-1  211,-9  252,-7  valid None  False False  None None  None None

我尝试了什么,我可以做 1、3、4 类,但无法弄清楚我尝试过 concat 和 for 嵌套循环的第二类来得到它

ex=pd.concat([pd.Series(d) for d in (eg1)], axis=1).T

然后合并它。正如我所说,无法完全弄清楚!

标签: pythonpandasdataframe

解决方案


我写了一个简短的递归函数,它返回一个系列,或者如果您的 dict 中的一个键(例如category_2)包含多个 dicts 的列表,则返回几个系列的串联。

def expand(x):
    if type(x) == dict:
        return pd.Series(x)
    elif type(x) == list:
        return pd.concat([expand(i) for i in x])

如果我从您在上面的示例中粘贴的字典开始:

d = {'category_1': [{'a': '151',
   'b': '116',
   'c': '86'}],
 'category_2': [{'d': '201',
   'e': '211',
   'f': '252'},
  {'d': '-1',
   'e': '-9',
   'f': '-7'}],
 'category_3': {'g': 'Valid',
   'h': None,
   'i': False,
   'j': False},
 'category_4': {'k': None,
   'l': None,
   'm': None,
   'n': None}}

然后只需连接我编写的递归方法创建的所有系列即可:

output = pd.concat([expand(value) for key, value in d.items()])

并合并任何重复的索引,以便它们的项目出现在一行中并用逗号分隔。我还将系列重塑为具有一行和多列的 df:

output = pd.DataFrame(output.groupby(output.index).apply(lambda x: ','.join(x.astype(str)))).T

这会产生一个与您所需的输出相匹配的数据框:

output

    a    b    c   d        e        f       g      h     i        j        k     l     m     n
0   151  116  86  201,-1   211,-9   252,-7  Valid  None  Invalid  Invalid  None  None  None  None

推荐阅读