Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 熊猫展开-嵌套列的顺序_Python_Pandas - Fatal编程技术网

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
。这是可以调整的。我理解的太多了,我很欣赏这个替代方案!