【问题标题】:extract nested json/list in Python在 Python 中提取嵌套的 json/list
【发布时间】:2020-03-03 02:59:05
【问题描述】:

我在 Python 中有以下 json/list 结构:

    {
        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 库。

我一直在努力解决这个问题,所以任何帮助都将不胜感激,谢谢。

【问题讨论】:

    标签: python json python-2.6


    【解决方案1】:

    您可以使用一个函数来展平嵌套的 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
    

    【讨论】:

    • 谢谢,我会试一试的。我不能使用 Pandas(抱歉,我应该在一开始就添加它),但递归函数对我来说似乎是一个很好的解决方案。
    猜你喜欢
    • 2020-06-28
    • 2021-11-05
    • 2021-06-10
    • 2018-12-18
    • 1970-01-01
    • 1970-01-01
    • 2019-10-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多