使用Python Pandas将列转换为行

6
我有一个像这样的数据框:
 id  a  b  c
101  0  3  0
102  2  0  5
103  0  1  4

我想要类似于这样的东西。
 id  letter  num
101     a     0
101     b     3
101     c     0
102     a     2
102     b     0
102     c     5
103     a     0
103     b     1
103     c     4

我希望将列名称和其对应的ID一起传递给行值,然后得到数据框的结果。
我尝试通过循环来实现,根据每个元素的ID引入它们,但是这种方法难以维护。有没有更简单的方式可以实现这个目标?
3个回答

7
您可以使用melt函数进行数据转换,然后再进行排序。
>>> pd.melt(df, id_vars='id', value_vars=['a','b','c'], 
            var_name='letter', value_name='num').sort_values('id')
    id letter  num
0  101      a    0
3  101      b    3
6  101      c    0
1  102      a    2
4  102      b    0
7  102      c    5
2  103      a    0
5  103      b    1
8  103      c    4

如果您想重置索引,您可以在返回的DataFrame上始终使用.reset_index(drop=True)

这个解决方案比我的可怕的for循环更好,我只需要添加 value_vars 而不是 ['a','b','c'] -> list(df.columns[1:] ) 因为我有比a、b、c更多的列。 - Rosa Alejandra

0

你可能想要做一些类似于以下的事情

df2 = df.stack().reset_index(1)

然后重命名列

df2.columns = ['letter', 'num']

df.stack() 会生成一个带多级索引的序列:

In [5]: df.stack()
Out[5]: 
id    
101  a    0
     b    3
     c    0
102  a    2
     b    0
     c    5
103  a    0
     b    1
     c    4
dtype: int64

您想将这个多级索引拆分成它们自己的列。使用 reset_index(1) 会将 id 列作为索引。但请注意,其他列的名称是错误的(对应于它们在多级索引中的旧级别)。

In [6]: df.stack().reset_index(1)
Out[6]: 
    level_1  0
id            
101       a  0
101       b  3
101       c  0
102       a  2
102       b  0
102       c  5
103       a  0
103       b  1
103       c  4

所以将它们重命名:

In [8]: df2.columns = ['letter', 'num']

In [9]: df2
Out[9]: 
    letter  num
id             
101      a    0
101      b    3
101      c    0
102      a    2
102      b    0
102      c    5
103      a    0
103      b    1
103      c    4

0
你可以使用 ravel 将值重新整形为一列。
df = pd.DataFrame({'id': [101, 102, 103], 
                   'a': [0, 2, 0], 
                   'b': [3, 0, 1], 
                   'c': [0, 5, 4]})[['id', 'a', 'b', 'c']]

>>> pd.DataFrame({'letter': df.columns[1:].tolist() * len(df), 
                  'num': df.iloc[:, 1:].values.ravel()})
  letter  num
0      a    0
1      b    3
2      c    0
3      a    2
4      b    0
5      c    5
6      a    0
7      b    1
8      c    4

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