извлечь вложенный JSON / список в Python - PullRequest
0 голосов
/ 06 ноября 2019

У меня есть следующая структура json / list в Python:

    {
        u'week': 45,
        u'value': 
        {
            u'team': u'accounts', 
            u'KPI': 4, 
            u'Mgr': 1, 
            u'change': 0, 
            u'risk': 1000, 
            u'subGroups': [
                {
                    u'team': u'HR', 
                    u'KPI': 4, 
                    u'Mgr': 1, 
                    u'change': 0, 
                    u'risk': 2000, 
                    u'subGroups': [
                        {
                            u'team': u'Marketing', 
                            u'KPI': 4, 
                            u'Mgr': 1, 
                            u'change': 0, 
                            u'risk': 3000, 
                            u'subGroups': []
                        }
                    ]
                }
            ]
        }
    },
    {
        u'week': 44, 
        u'value': {
            u'team': u'accounts', 
            u'KPI': 4, 
            u'Mgr': 1, 
            u'change': 0, 
            u'risk': 4000, 
            u'subGroups': [
                {
                    u'team': u'HR', 
                    u'KPI': 4, 
                    u'Mgr': 1, 
                    u'change': 0, 
                    u'risk': 5000, 
                    u'subGroups': [
                        {
                            u'team': u'Marketing', 
                            u'KPI': 4, 
                            u'Mgr': 1, 
                            u'change': 0, 
                            u'risk': 6000, 
                            u'subGroups': []
                        }
                    ]
                }
            ]
        }
    },
    {
        u'week': 34, 
        u'value': {
            u'team': u'accounts', 
            u'KPI': 29, 
            u'Mgr': 1, 
            u'change': 0, 
            u'risk': 20000, 
            u'subGroups': [
                {
                    u'team': u'HR', 
                    u'KPI': 29, 
                    u'Mgr': 1, 
                    u'change': 0, 
                    u'risk': 20000, 
                    u'subGroups': [
                        {
                            u'team': u'Marketing', 
                            u'KPI': 29, 
                            u'Mgr': 1, 
                            u'change': 0, 
                            u'risk': 20000, 
                            u'subGroups': []
                        }
                    ]
                }
            ]
        }
    }
]

И мне нужно извлечь некоторые значения, чтобы создать следующее

[
    {
        'team':'accounts', 
        risk : [
            1000,
            4000,
            20000
        ]
    },
    {
        'team': 'HR', 
        'risks'[
            2000,
            5000,
            2000
        ]
        },
    {
        'team' : 'Marketing', 
        risk : [
            3000,
            6000,
            2000
        ]
    }
]

На практике может быть любое числонедель и любое количество уровней подгрупп. Кроме того, из-за ограничений контейнера Docker мне нужно использовать только стандартные библиотеки Python 2.

Я связывал себя узами, пытаясь заставить это работать, поэтому любая помощь будет оценена, спасибо.

1 Ответ

0 голосов
/ 06 ноября 2019

Вы можете использовать функцию, которая разметит вложенный json, а затем восстановит его. Здесь я бросил его в стол, а затем вы можете просто нарезать его и нарезать кубиками так, как вам хочется:

import pandas as pd
import re


data = [{u'week': 45, u'value': {u'team': u'accounts', u'KPI': 4, u'Mgr': 1, u'change': 0, u'risk': 1000, u'subGroups': [{u'team': u'HR', u'KPI': 4, u'Mgr': 1, u'change': 0, u'risk': 2000, u'subGroups': [{u'team': u'Marketing', u'KPI': 4, u'Mgr': 1, u'change': 0, u'risk': 3000, u'subGroups': []}]}]}},
{u'week': 44, u'value': {u'team': u'accounts', u'KPI': 4, u'Mgr': 1, u'change': 0, u'risk': 4000, u'subGroups': [{u'team': u'HR', u'KPI': 4, u'Mgr': 1, u'change': 0, u'risk': 5000, u'subGroups': [{u'team': u'Marketing', u'KPI': 4, u'Mgr': 1, u'change': 0, u'risk': 6000, u'subGroups': []}]}]}},
{u'week': 34, u'value': {u'team': u'accounts', u'KPI': 29, u'Mgr': 1, u'change': 0, u'risk': 20000, u'subGroups': [{u'team': u'HR', u'KPI': 29, u'Mgr': 1, u'change': 0, u'risk': 20000, u'subGroups': [{u'team': u'Marketing', u'KPI': 29, u'Mgr': 1, u'change': 0, u'risk': 20000, u'subGroups': []}]}]}}]


def flatten_json(y):
    out = {}
    def flatten(x, name=''):
        if type(x) is dict:
            for a in x:
                flatten(x[a], name + a + '_')
        elif type(x) is list:
            i = 0
            for a in x:
                flatten(a, name + str(i) + '_')
                i += 1
        else:
            out[name[:-1]] = x
    flatten(y)
    return out


flat = flatten_json(data)
columns_list = list(flat.keys())
rows = {}
for item in columns_list:

    row_idx = re.findall(r'(\d+)\_', item )[0]

    column = re.findall(r'\d+\_(.*)', item )[0]

    row_idx = int(row_idx)
    value = flat[item]

    if row_idx in rows:
        rows[row_idx][column] = value
    else:
        rows[row_idx] = {}
        rows[row_idx][column] = value

results = pd.DataFrame()       
for idx, row in rows.items():
    results = results.append(pd.DataFrame(row, index=[idx]), sort=True)

Вывод:

print (results.to_string())
   value_KPI  value_Mgr  value_change  value_risk  value_subGroups_0_KPI  value_subGroups_0_Mgr  value_subGroups_0_change  value_subGroups_0_risk  value_subGroups_0_subGroups_0_KPI  value_subGroups_0_subGroups_0_Mgr  value_subGroups_0_subGroups_0_change  value_subGroups_0_subGroups_0_risk value_subGroups_0_subGroups_0_team value_subGroups_0_team value_team  week
0          4          1             0        1000                      4                      1                         0                    2000                                  4                                  1                                     0                                3000                          Marketing                     HR   accounts    45
1          4          1             0        4000                      4                      1                         0                    5000                                  4                                  1                                     0                                6000                          Marketing                     HR   accounts    44
2         29          1             0       20000                     29                      1                         0                   20000                                 29                                  1                                     0                               20000                          Marketing                     HR   accounts    34
...