Python 熊猫展开-嵌套列的顺序
我有以下格式的数据帧:Python 熊猫展开-嵌套列的顺序,python,pandas,Python,Pandas,我有以下格式的数据帧: 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
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列在值列的顶部而不是下方对齐?与and一起使用:
与和一起使用:
您还可以使用swaplevel
,而不是使用set_index
和unstack
:
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
您还可以使用swaplevel
,而不是使用set_index
和unstack
:
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
感谢您的回复,我无法获得我想要的准确格式,因为b级别在我希望每个值列只出现一次时重复了。@user3054852我刚刚给了您一个解决方案,建议不需要
set_index
和unstack
<可以使用代码>枢轴。和swaplevel
可用于提升b
。这是可以调整的。我理解的太多了,我很欣赏这个替代方案!感谢您的回复,我无法获得我想要的准确格式,因为b级别在我希望每个值列只出现一次时重复了。@user3054852我刚刚给了您一个解决方案,建议不需要set_index
和unstack
<可以使用代码>枢轴。和swaplevel
可用于提升b
。这是可以调整的。我理解的太多了,我很欣赏这个替代方案!