【问题标题】:Creating a multi-header table from JSON从 JSON 创建多头表
【发布时间】:2020-06-28 22:32:37
【问题描述】:

我是熊猫新手。我正在尝试创建下表:

        |          C         |          Perl      |
        |   line   |   func  |    line   |   func |
version |  covered |  total  |  covered  |  total |

我创建的 JSON 结构如下:

{
   "version1":{
      "perl":{
         "line_covered":207,
         "line_total":312,
         "func_covered":15,
         "func_total":18
      },
      "C":{
         "line_covered":321,
         "line_total":512,
         "func_covered":10,
         "func_total":10
      }
   }
}

我想遍历这个 JSON 并创建表。我的第一个问题是我似乎无法理解我应该如何创建表格的标题。从以前的主题中,我发现我应该使用 MultiIndex 但由于某种原因,我尝试的任何组合都不会创建想要的标题。可以告诉我如何创建这个表吗?

【问题讨论】:

    标签: python pandas multi-index


    【解决方案1】:

    我的方法

    import numpy as np
    from collections import defaultdict
    d = defaultdict(list)
    

    for k,v in my_dict.items():
        d['index'].append(k)
        for k1,v1 in v.items():
            for k2,v2 in v1.items():
                d['columns'].append((k1,k2))
                d['data'].append(v2)
    d = dict(d)
    d['data'] = np.array(d['data']).reshape(1, len(d['data']))
    d['columns'] = pd.MultiIndex.from_tuples(columns)
    

    构建数据框

    pd.DataFrame(**d)
    

    输出

                     perl                                               C                       
             line_covered line_total func_covered func_total func_covered           func_total   
    version1          207        312           15         18           10  version1         10   
    

    使用defaultdict,但可以在开始循环之前启动三个列表

    编辑

    预期输出用途

    import numpy as np
    from collections import defaultdict
    d = defaultdict(list)
    for k,v in my_dict.items():
        d['index'].append(k)
        for k1,v1 in v.items():
            for k2,v2 in v1.items():
                split = k2.split('_')
                d['columns'].append((k1, split[0]))
                d['data'].append(split[1])
    d = dict(d)
    d['data'] = np.array(d['data']).reshape(1,len(d['data']))
    d['columns'] = pd.MultiIndex.from_tuples(d['columns']).copy()
    pd.DataFrame(**d)
    

    输出

                 perl                               C       
                 line   line     func   func     func   func
    version1  covered  total  covered  total  covered  total
    

    详情

    print(d)
    #{'index': ['version1'], 'columns': MultiIndex([('perl', 'line_covered'),
    #            ('perl',   'line_total'),
    #            ('perl', 'func_covered'),
    #            ('perl',   'func_total'),
    #            (   'C', 'func_covered'),
    #            (   'C',   'func_total')],
    #           ), 'data': array([[207, 312,  15,  18,  10,  10]])}
    

    你可以看看**做了什么

    【讨论】:

    • numpy 库,需要 import numpy as np,
    • 我明白了。出于某种原因,我在d['data'] = np.array(d['data']).reshape(1,len(data)) 线上得到了ValueError: cannot reshape array of size 8 into shape (1,1)
    • 抱歉,您需要 .reshape(1,len(d['data']) 我使用 data,但我忘了删除它。解决方案更新
    • 谢谢!我试图打印d,但我得到{'index': ['version1'], 'columns': MultiIndex(levels=[['C', 'perl'], ['func', 'line']], labels=[[1, 1, 1, 1, 0, 0, 0, 0], [0, 0, 1, 1, 0, 0, 1, 1]]), 'data': array([['covered', 'total', 'covered', 'total', 'covered', 'total', 'covered', 'total']], dtype='<U7')}。不知道为什么。如果我打印**d,它不会显示数字。
    • 不客气 :),我们使用 ** 将参数传递给 pd.DataFrame 对象,您可以看到:stackoverflow.com/questions/36901/…,您可以检查:dict(**d) == d 是否为 True
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-26
    • 1970-01-01
    相关资源
    最近更新 更多