在pandas数据帧中转换多索引行中的某些行

时间:2014-05-11 20:57:07

标签: python pandas transform dataframe

假设我有一个pandas数据帧如下:

     A      B      C      D
0    a0     b0     c0     d0
1    a1     b1     c1     d1
2    a2     b2     c2     d2
3    a3     b3     c3     d3

我想知道如何将其转换为此。

                   A      B
0    C      c0     a0     b0          
     D      d0     a0     b0          
1    C      c1     a1     b1          
     D      d1     a1     b1          
2    C      c2     a2     b2          
     D      d2     a2     b2          
3    C      c3     a3     b3          
     D      d3     a3     b3          

基本上将几列作为行并创建一个多索引。

1 个答案:

答案 0 :(得分:0)

好吧,melt会以你想要的形式得到它,然后你可以根据需要设置索引:

print df

0  a0  b0  c0  d0
1  a1  b1  c1  d1
2  a2  b2  c2  d2
3  a3  b3  c3  d3

现在使用melt来堆叠(注意,我重置索引并将该列用作id_var,因为它看起来像你想要包含在堆叠中的[0,1,2,3]索引): / p>

new = pd.melt(df.reset_index(),value_vars=['C','D'],id_vars=['index','A','B'])
print new

  index   A   B variable value
0      0  a0  b0        C    c0
1      1  a1  b1        C    c1
2      2  a2  b2        C    c2
3      3  a3  b3        C    c3
4      0  a0  b0        D    d0
5      1  a1  b1        D    d1
6      2  a2  b2        D    d2
7      3  a3  b3        D    d3

现在只需设置索引(对其进行排序然后设置索引以使其看起来像您想要的输出):

new = new.sort(['index']).set_index(['index','variable','value'])
print new

                       A   B
index variable value        
0     C        c0     a0  b0
      D        d0     a0  b0
1     C        c1     a1  b1
      D        d1     a1  b1
2     C        c2     a2  b2
      D        d2     a2  b2
3     C        c3     a3  b3
      D        d3     a3  b3 

如果你不需要[0,1,2,3]作为堆栈的一部分,那么融化命令会更清晰:

print pd.melt(df,value_vars=['C','D'],id_vars=['A','B'])

    A   B variable value
0  a0  b0        C    c0
1  a1  b1        C    c1
2  a2  b2        C    c2
3  a3  b3        C    c3
4  a0  b0        D    d0
5  a1  b1        D    d1
6  a2  b2        D    d2
7  a3  b3        D    d3