将列传递给python pandas上的行

时间:2016-04-18 20:15:39

标签: python pandas dataframe

我有一个像这样的数据框

 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和df的结果。

我试图在一个循环中创建它,根据它的id引入每个元素,但它太可怕了。有一个简单的方法吗?

3 个答案:

答案 0 :(得分:6)

您可以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)

答案 1 :(得分: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

答案 2 :(得分: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