繁体   English   中英

嵌套 JSON 具有唯一键以展平 DataFrame 与列中的前 2 级键

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM