[英]Nested JSON with unique keys to flatten DataFrame with first 2 levels keys in columns
我有这个 JSON:
{'57333310':
{'3179138607':
{'clicks': 0,
'spent': 0,
'cpc': 0,
'qualityFactor': 1.5},
'0':
{'clicks': 0,
'spent': 0,
'cpc': 0,
'qualityFactor': 1.5}},
'57335920':
{'4001223651':
{'clicks': 0,
'spent': 0,
'cpc': 0,
'qualityFactor': 1.5},
'896887695':
{'clicks': 0,
'spent': 0,
'cpc': 0,
'qualityFactor': 1.5},
'0':
{'clicks': 0,
'spent': 0,
'cpc': 0,
'qualityFactor': 1.5}}}
我测试的所有方法(不包括迭代字典的嵌套循环)都没有返回这样的表:
key_1 key_2 clicks spent cpc qualityFactor
0 57333310 3179138607 0 0.0 0.00 1.5
1 57333310 0 0 0.0 0.00 1.5
2 57335920 4001223651 0 0.0 0.00 1.5
3 57335920 896887695 0 0.0 0.00 1.5
4 57335920 0 0 0.0 0.00 1.5
我试过这段代码:
# d is JSON dictionary
df = pd.DataFrame()
for key_1 in d.keys():
for key_2 in d[key_1].keys():
df = df.append(pd.DataFrame.from_dict(d[key_1][key_2], orient = 'index').T.join(
pd.DataFrame({'key_1':[key_1], 'key_2':[key_2]})), ignore_index = True)
df
返回
clicks spent cpc qualityFactor key_1 key_2
0 0.0 0.0 0.0 1.5 57333310 3179138607
1 0.0 0.0 0.0 1.5 57333310 0
2 0.0 0.0 0.0 1.5 57335920 4001223651
3 0.0 0.0 0.0 1.5 57335920 896887695
4 0.0 0.0 0.0 1.5 57335920 0
和这个:
for key_1 in d.keys():
for key_2 in d[key_1].keys():
d[key_1][key_2].update({'key_1': key_1})
d[key_1][key_2].update({'key_2': key_2})
r = []
for l in list([list(x.values()) for x in list(d.values())]):
r += l
df = pd.DataFrame(r)[['key_1','key_2','clicks','spent','cpc','qualityFactor']]
df
返回
key_1 key_2 clicks spent cpc qualityFactor
0 57333310 3179138607 0 0 0 1.5
1 57333310 0 0 0 0 1.5
2 57335920 4001223651 0 0 0 1.5
3 57335920 896887695 0 0 0 1.5
4 57335920 0 0 0 0 1.5
两种方法都可以,但是第一,代码不应该有嵌套循环,第二,每一层嵌套都必须用一个新的嵌套循环来处理,这使得代码对于任何嵌套都不是通用的,因为需要一个新的循环还要用手完成。
任务是在不使用循环(至少是嵌套循环)的情况下获得这样的数据框。 有没有人有解决方案?
将列表理解与转换键一起使用到辅助字典,最后传递给DataFrame
构造函数是最快的解决方案,尤其是在许多嵌套字典的情况下:
L = [{**{'key_1':k1, 'key_2':k2}, **v2} for k1, v1 in d.items() for k2, v2 in v1.items()]
df = pd.DataFrame(L)
print (df)
key_1 key_2 clicks spent cpc qualityFactor
0 57333310 3179138607 0 0 0 1.5
1 57333310 0 0 0 0 1.5
2 57335920 4001223651 0 0 0 1.5
3 57335920 896887695 0 0 0 1.5
4 57335920 0 0 0 0 1.5
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.