Pandasunstacking-嵌套列的顺序
我有以下格式的数据框:
a b c v1 v2
0 a1 b1 c1 1 5
1 a2 b1 c1 2 6
2 a1 b2 c1 3 7
3 a2 b2 c1 4 8
我想要实现的是这种格式:
b1 b2
v1 v2 v1 v2
a c
a1 c1 1 3 5 7
a2 c1 2 4 6 8
因此,原始数据构造如下:
foo = pd.DataFrame({
"a": ["a1", "a2", "a1", "a2"],
"b": ["b1", "b1", "b2", "b2"],
"c": ["c1", "c1", "c1", "c1"],
"v1": [1,2,3,4],
"v2": [5,6,7,8]
})
然后我试图
foo.set_index(["a", "b", "c"]).unstack("b")
然而,这导致
v1 v2
b1 b2 b1 b2
a c
a1 c1 1 3 5 7
a2 c1 2 4 6 8
随后,我的问题是如何使未堆叠的b列在值列的顶部而不是在它们下方对齐?
回答
您还可以使用pivot而不是使用set_index和unstack与swaplevel:
In [565]: foo.pivot(["a", "c"], columns='b').swaplevel(0,1, axis=1)
Out[565]:
b b1 b2 b1 b2
v1 v1 v2 v2
a c
a1 c1 1 3 5 7
a2 c1 2 4 6 8
为了得到你的输出,你可以这样做:
In [2941]: foo.pivot(["a", "c"], columns='b').swaplevel(0,1, axis=1).sort_index(axis=1).rename_axis((None, None), axis=1)
Out[2941]:
b1 b2
v1 v2 v1 v2
a c
a1 c1 1 5 3 7
a2 c1 2 6 4 8