Python Pandas:转置还是堆叠?

4

你好,我有一个如下的数据框。我想通过转置来获得期望的结果,但遇到了麻烦。

x = ('P', 'P', 'O', 'DNP', 'D')
y = ('O', 'O', 'D', 'DNP', 'DNP')
z = ('P', 'P', 'O', 'U', 'DNP')
a = ('O', 'O', 'D', 'DNP', 'DNP')
b = ('P', 'DNP', 'O', 'U', 'DNP')
ID = ['ID1', 'ID2', 'ID3', 'ID4', 'ID5']
df = DataFrame(zip(ID, a, b, x, y, z), columns = ['id', 'a', 'b', 'x', 'y', 'z'])

    id    a    b    x    y    z
0  ID1    O    P    P    O    P
1  ID2    O  DNP    P    O    P
2  ID3    D    O    O    D    O
3  ID4  DNP    U  DNP  DNP    U
4  ID5  DNP  DNP    D  DNP  DNP

一个简单的 df.transpose() 方法会产生...

0    1    2    3    4
id  ID1  ID2  ID3  ID4  ID5
a     O    O    D  DNP  DNP
b     P  DNP    O    U  DNP
x     P    P    O  DNP    D
y     O    O    D  DNP  DNP
z     P    P    O    U  DNP

期望的输出如下所示......
   ID1    a    O
   ID1    b    P
   ID1    x    P
   ID1    y    O
   ID1    z    P
   ID2    a    O
   ID2    b    DNP
   ID2    x    P
   ID2    y    O
   ID2    z    P

等等其他类似的内容......非常感谢您的帮助!

1个回答

3
您可以使用 pd.melt 来实现:
In [23]: pd.melt(df, id_vars=['id'], var_name='colvals', value_name='DOPU')
Out[23]: 
     id colvals DOPU
0   ID1       a    O
1   ID2       a    O
2   ID3       a    D
...
21  ID2       z    P
22  ID3       z    O
23  ID4       z    U
24  ID5       z  DNP

或者,作为替代方案,在调用 stack 之前,您可以将 id 设置为索引:
In [21]: df.set_index('id').stack()
Out[21]: 
id    
ID1  a      O
     b      P
     x      P
     y      O
     z      P
...         
ID5  a    DNP
     b    DNP
     x      D
     y    DNP
     z    DNP
dtype: object
stack将列级别的值移动到索引中。既然所需结果在索引中也有id值,自然可以使用set_indexid列先移动到索引中,然后再调用stack
调用reset_index将索引级别移回DataFrame列中:
In [164]: df.columns.name = 'colvals'
In [165]: df.set_index('id').stack().reset_index()
Out[165]: 
     id colvals    0
0   ID1       a    O
1   ID1       b    P
2   ID1       x    P
3   ID1       y    O
4   ID1       z    P
...
20  ID5       a  DNP
21  ID5       b  DNP
22  ID5       x    D
23  ID5       y  DNP
24  ID5       z  DNP

谢谢unutbu,比我想象的容易得多。有没有办法不将ID列设置为索引,以便期望的结果将在每个实例中都有ID?我想将结果制作成一个新的数据框。谢谢! - boothtp
使用 reset_index 将索引级别移动到(DataFrame)列中。 - unutbu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接