为了账号安全,请及时绑定邮箱和手机立即绑定

flatten_json 列表的递归展平函数

flatten_json 列表的递归展平函数

慕娘9325324 2022-10-11 21:39:17
我想在每个级别展平以下 JSON 并为每个级别创建一个 pandas 数据框,flatten_json我曾经这样做过,但为此我需要遍历每个级别,从而创建多个嵌套的 for 循环:{"metadata": {    "name": "abc",    "time": "2020-04-01"},"data": [    {        "identifiers": [            {                "type": "abc",                "scheme": "def",                "value": "123"            },            {                "type": "abc",                "scheme": "def",                "value": "123"            }        ],        "name": "qwer",        "type": "abd",        "level1": [            {                "identifiers": [                    {                        "type": "abc",                        "scheme": "def",                        "value": "123"                    },                    {                        "type": "abc",                        "scheme": "def",                        "value": "123"                    }                ],                "name": "asd",                "type": "abd",                "level2": [                    {                        "identifiers": [                            {                                "type": "abc",                                "scheme": "def",                                "value": "123"                            },                            {                                "type": "abc",                                "scheme": "def",                                "value": "123"                            }                        ],                        "name": "abs",                        "type": "abd"                    },         
查看完整描述

1 回答

?
收到一只叮咚

TA贡献1821条经验 获得超4个赞

我使用递归解决了它,这是我的代码:


import json

import pandas as pd

import flatten_json as fj


keys = {'data', 'level1', 'level2', 'level3'}

with open('test_lh.json') as f:

    data = json.load(f)


levels = ['data.level1.level2.level3', 'data.level1.level2', 'data.level1', 'data']

recs_dict = {}


def do_step(data_dict, level, depth, path):

    recs = []

    for x in data_dict[level]:

        if depth < len(path.split('.'))-1:

            do_step(x, path.split('.')[depth+1], depth+1, path)

        else:

            dic = fj.flatten(x, root_keys_to_ignore=keys)

            recs.append(dic)

    recs_dict[level] = recs


for path in levels:

    do_step(data, path.split('.')[0], 0, path)


for key, value in recs_dict.items():

    print(key)

    df = pd.DataFrame(recs_dict[key])

    print(df)

这是输出:


level3

  identifiers_0_type identifiers_0_scheme identifiers_0_value identifiers_1_type identifiers_1_scheme identifiers_1_value name    type

0                abc                  def                 123                abc                  def                 123  abs  level3

1                abc                  def                 123                abc                  def                 123  abs  level3

level2

  identifiers_0_type identifiers_0_scheme identifiers_0_value identifiers_1_type identifiers_1_scheme identifiers_1_value name    type

0                abc                  def                 123                abc                  def                 123  abs  level2

1                abc                  def                 123                abc                  def                 123  abs     abd

level1

  identifiers_0_type identifiers_0_scheme identifiers_0_value identifiers_1_type identifiers_1_scheme identifiers_1_value name    type

0                abc                  def                 123                abc                  def                 123  asd  level1

data

  identifiers_0_type identifiers_0_scheme identifiers_0_value identifiers_1_type identifiers_1_scheme identifiers_1_value  name type

0                abc                  def                 123                abc                  def                 123  qwer  abd



查看完整回答
反对 回复 2022-10-11
  • 1 回答
  • 0 关注
  • 102 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信