我有一个嵌套字典对象我想转换为多索引数据框,我该怎样才能实现它。
E.g。
t['a'] = dict()
t['b'] = dict()
t['a']['1'] = pd.DataFrame([ [1.0,2.0],[3.0,4.0] ])
t['a']['2'] = pd.DataFrame([ [5.0,6.0],[7.0,8.0] ])
t['b']['1'] = pd.DataFrame([ [1.0,2.0],[3.0,4.0] ])
t['b']['2'] = pd.DataFrame([ [5.0,6.0],[7.0,8.0] ])
所以我想转换为一个像
这样的索引的数据框a
1 0 1
0 1.0 2.0
1 3.0 4.0
2
0 5.0 6.0
1 7.0 8.0
b
1
0 1.0 2.0
1 3.0 4.0
2
0 5.0 6.0
1 7.0 8.0
我想我可以使用MultiIndex(levels=[ ['a','b'], [1,2] ])
,但我不知道如何构建标签。我也不知道如何将dict值作为数据数组传递。
答案 0 :(得分:4)
我发现从元组列表中获取MultiIndex是最简单的,如here所述。
使用您的示例,我们有一个嵌套字典,如
In [25]: t
Out[25]:
{'a': {'1': 0 1
0 1 2
1 3 4, '2': 0 1
0 5 6
1 7 8},
'b': {'1': 0 1
0 1 2
1 3 4, '2': 0 1
0 5 6
1 7 8}}
如果你想让你的头部受到一点伤害,你可以使用这个列表理解:
In [50]: tuples = [(x, y, z) for x in t for y in t[x] for z in t[x][y]]
In [51]: tuples
Out[51]:
[('a', '1', 0),
('a', '1', 1),
('a', '2', 0),
('a', '2', 1),
('b', '1', 0),
('b', '1', 1),
('b', '2', 0),
('b', '2', 1)]
然后idx = pd.MultiIndex.from_tuples(tuples)
将作为您的索引。
获取值解压缩是一项工作。
编辑:你真的应该去看杰夫的答案,但为了完整性:
In [114]: df = pd.concat([x for z in t for x in t[z].values()])
In [115]: df.index = idx
In [118]: df
Out[118]:
0 1
a 1 0 1 2
1 3 4
2 0 5 6
1 7 8
b 1 0 1 2
1 3 4
2 0 5 6
1 7 8
答案 1 :(得分:1)
框架的dict形成一个面板,to_frame
转换为2级索引,
你想要一个额外的级别,当传递一个字典时,它会形成连字符
理论上,如果你需要更多关卡,你可以做一些类似递归减少的事情,但这会让你的大脑爆炸。要获得准确的输出,您可以执行sortlevel
。
In [36]: concat( dict([ (k,Panel(v).to_frame()) for k,v in t.items() ]) , names= ['level'])
Out[36]:
1 2
level major minor
a 0 0 1 5
1 2 6
1 0 3 7
1 4 8
b 0 0 1 5
1 2 6
1 0 3 7
1 4 8