我正在努力为自己遇到的问题编写可移植的代码。我有大量的数据,以嵌套词典的形式组织,并且处于所述嵌套的“底层”级别(不一定是相同数目)我有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值。
如果“最佳”方法是使用发电机,或者有什么我没看到的东西(我的大脑现在有点炸了),我全是耳朵。任何帮助将不胜感激。
答案 0 :(得分: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'