Python 从JSON创建多标头表
我对熊猫不熟悉。我正在尝试创建下表:Python 从JSON创建多标头表,python,pandas,multi-index,Python,Pandas,Multi Index,我对熊猫不熟悉。我正在尝试创建下表: | C | Perl | | line | func | line | func | version | covered | total | covered | total | 我创建了以下JSON结构: { "version1":{ "perl":{ "line_covered":207
| 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并创建表。我的第一个问题是,我似乎无法理解如何创建表的标题。从前面的主题中,我发现我应该使用
多索引
,但由于某些原因,我尝试的任何组合都不会创建想要的标题。是否可以向我演示如何创建此表?我的方法
import numpy as np
from collections import defaultdict
d = defaultdict(list)
构建数据帧
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
perl C
line line func func func func
version1 covered total covered total covered total
使用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_covered line_total func_covered func_total func_covered func_total
version1 207 312 15 18 10 version1 10
perl C
line line func func func func
version1 covered total covered total covered total
细节
你可以看到什么做numpy库,你需要导入numpy作为np,我明白了。由于某些原因,我得到了
ValueError:无法将大小为8的数组重塑为形状(1,1)
在线d['data']=np.array(d['data'])。重塑(1,len(data))
对不起,您需要。重塑(1,len(d['data'])
我使用数据,但忘了将其删除。解决方案更新了!我试图打印d
,但我得到了{'index':['version1'],'columns':多索引(级别=['C','perl'],['func','line']],标签=[[1,1,1,1,1,0,0],[0,0,1,1,1,0,0,1]],'data':数组([[[covered','total','covered','total','covered','covered','total','covered','total']),dtype='Your'welcome:),我们使用**
将参数传递给pd.DataFrame
对象,您可以看到:,您可以检查:dict(**d)==d
是否为真