繁体   English   中英

将列传递给python pandas上的行

[英]Passing columns to rows on python pandas

我有这样的数据框

 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引入每个元素,但它太可怕了。 是否有捷径可寻?

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

你可能想要做一些事情

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)idreset_index(1)索引。 但请注意,其他列的名称错误(对应于多级索引中的以前级别)。

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

您可以使用ravel将值重新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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM