来自嵌套字典的 Pandas 数据框

Bar*_*ich 7 python dictionary dataframe pandas

我的字典是这样的:

{'x': {'b': 10, 'c': 20}, 'y': {'b': '33', 'c': 44}}
Run Code Online (Sandbox Code Playgroud)

我想得到一个如下所示的数据框:

index   col1    col2    val
0        x       b      10
1        x       c      20
2        y       b      33
3        y       c      44
Run Code Online (Sandbox Code Playgroud)

我尝试调用 pandas.from_dict(),但它没有给我想要的结果。那么,实现这一目标的最优雅、最实用的方法是什么?

编辑:实际上,我的字典的深度为 4,所以我希望看到针对这种情况的解决方案,或者理想情况下,可以在一般设置中针对任意深度工作的解决方案。

这是一个更深层次的字典的例子: {'x':{'a':{'m':1, 'n':2}, 'b':{'m':10, 'n':20}}, 'y':{'a':{'m':100, 'n':200}, 'b':{'m':111, 'n':222}} }合适的数据框应该有 8 行。

回答:

df = pd.DataFrame([(k1, k2, k3, k4, k5, v) for k1, k2345v in dict.items()
                           for k2, k345v in k2345v.items()
                           for k3, k45v in k345v.items()
                           for k4, k5v in k45v.items()
                           for k5, v in k5v.items()])
Run Code Online (Sandbox Code Playgroud)

Kyl*_*ing 6

对于任何深度,您可以使用pd.json_normalizemelt。下面是一个稍微修改过的 2/3/4 深度字典的示例

data = {'one': 1, 'two': {'a': 2}, 'four': {'a': {'b': {'c': 2}}},
        'x': {'a': {'m': 1, 'n': 2}, 'b': {'m': 10, 'n': 20}},
        'y': {'a': {'m': 100, 'n': 200}, 'b': {'m': 111, 'n': 222}}}
df_melt = pd.json_normalize(data, sep='>>').melt()
df_final = df_melt['variable'].str.split('>>', expand=True)
df_final.columns = [f'col{name}' for name in df_final.columns]
df_final[['value']] = df_melt['value']
Run Code Online (Sandbox Code Playgroud)
    col0  col1  col2  col3  value
0    one  None  None  None      1
1    two     a  None  None      2
2   four     a     b     c      2
3      x     a     m  None      1
4      x     a     n  None      2
5      x     b     m  None     10
6      x     b     n  None     20
7      y     a     m  None    100
8      y     a     n  None    200
9      y     b     m  None    111
10     y     b     n  None    222
Run Code Online (Sandbox Code Playgroud)

json_normalize真的很有用, Medium上还有一些其他示例


Sir*_*lot 5

您可以使用列表理解将 dict 重新排序为元组列表,其中每个元组是一行,然后您可以对数据框进行排序

import pandas as pd

d = {'x': {'b': 10, 'c': 20}, 'y': {'b': '33', 'c': 44}}

df = pd.DataFrame([(k,k1,v1) for k,v in d.items() for k1,v1 in v.items()], columns = ['Col1','Col2','Val'])
print df.sort(['Col1','Col2','Val'], ascending=[1,1,1])

  Col1 Col2 Val
3    x    b  10
2    x    c  20
1    y    b  33
0    y    c  44
Run Code Online (Sandbox Code Playgroud)

  • 你能编辑这个以使用任意深度的字典吗?就我而言,我的深度为 4,但理想情况下,我希望看到通用解决方案。谢谢 (2认同)