Python嵌套的数据框字典转换为JSON

时间:2019-01-25 03:40:12

标签: python json pandas dictionary recursion

我正在努力为自己遇到的问题编写可移植的代码。我有大量的数据,以嵌套词典的形式组织,并且处于所述嵌套的“底层”级别(不一定是相同数目)我有Pandas DataFrames。我只是想遍历Enter嵌套字典并将所有Pandas DataFrames转换为json并返回与输入相同的结构。下面是到目前为止我尝试过的示例代码。

import pandas as pd

a = [1,2,3,4]
b = [-1,-2,-3,-4]
c = [0,1,-1,0]
d = [1,1,1,-1]

names = ['one','two','three','four']
columns=[f"col_{name}" for name in names]
index=[f"ind_{name}" for name in names]

df_1 = pd.DataFrame([a,b,c,d], columns=columns, index=index)
df_2 = pd.DataFrame([b,c,d,a], columns=columns, index=index)
df_3 = pd.DataFrame([c,d,a,b], columns=columns, index=index)
df_4 = pd.DataFrame([d,a,b,c], columns=columns, index=index)
df_5 = pd.DataFrame([a,a,d,c], columns=columns, index=index)

x={
    'a': {
        'a1': df_1,
        'a2': df_2,
    },
    'b': {
        'b1': df_3,
    },
    'c': {
        'c1': {
            'c11': df_4,
        }
    },
    'd': df_5
}

def nested_dicts(d):
    for k, v in d.items():
        if isinstance(v, pd.DataFrame):
            return {k: v.T.to_json()}
        else:
            return nested_dicts(v)

d = nested_dicts(x)
for k in d.keys():
    print(k)
    print()

我已经尝试了尽可能多的方法,但这是对我的问题的最简单描述。我需要能够将其传递给前端Web服务,这就是为什么我需要将DataFrames转换为json的原因,但是我想保持层次结构,仅将df_1,...,df_5转换为其json值。

如果“最佳”方法是使用发电机,或者有什么我没看到的东西(我的大脑现在有点炸了),我全是耳朵。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:2)

要考虑的两件事。

  1. 递归方法。请仔细阅读。您实施的方式是错误的。
  2. 最好复制原始字典,直到并且除非您绝对想修改原始字典。

这是我认为应该可行的解决方案。

import copy
import pandas as pd

def nested_dicts(d):
    for k, v in d.items():
        if isinstance(v, pd.DataFrame):
            d[k] = v.T.to_json()
        else:
            d[k] = nested_dicts(v)
    return d

d = nested_dicts(copy.deepcopy(x))   # Deepcopy to keep x intact

干杯!

答案 1 :(得分:0)

您需要做的是递归地访问每个字典,如果任何数据的数据类型与您想要的匹配,那么您就拥有了

def iterdict(d):
    pandas = pd
    for k,v in d.items():
        if isinstance(v, dict):
            iterdict(v)
        else:
            if type(v) == pandas.core.frame.DataFrame:
                print("\nthis is pandas !\n\n" , v)


iterdict(x) 

>> 

this is pandas !

            col_one  col_two  col_three  col_four
ind_one          1        2          3         4
ind_two         -1       -2         -3        -4
ind_three        0        1         -1         0
ind_four         1        1          1        -1

this is pandas !

            col_one  col_two  col_three  col_four
ind_one         -1       -2         -3        -4
ind_two          0        1         -1         0
ind_three        1        1          1        -1
ind_four         1        2          3         4

this is pandas !

            col_one  col_two  col_three  col_four
ind_one          0        1         -1         0
ind_two          1        1          1        -1
ind_three        1        2          3         4
ind_four        -1       -2         -3        -4

this is pandas !

            col_one  col_two  col_three  col_four
ind_one          1        1          1        -1
ind_two          1        2          3         4
ind_three       -1       -2         -3        -4
ind_four         0        1         -1         0

this is pandas !

            col_one  col_two  col_three  col_four
ind_one          1        2          3         4
ind_two          1        2          3         4
ind_three        1        1          1        -1
ind_four         0        1         -1         0


我添加了pandas = pd,因为否则将无法识别类型'pandas'