代码之家  ›  专栏  ›  技术社区  ›  mpx

将多个列堆叠到单个列中,同时保留其他列?

  •  0
  • mpx  · 技术社区  · 4 年前

    给定多个列,如下所示

        cl_a cl_b  cl_c  cl_d  cl_e 
    0     1    a     5     6    20
    1     2    b     4     7    21
    2     3    c     3     8    22
    3     4    d     2     9    23
    4     5    e     1    10    24
    

    我想把柱子叠起来 cl_c cl_d cl_e 到一列中 ax . 但是,请注意,列 cl_a cl_b

    cl_a cl_b ax from_col
    1,a,5,cl_c
    2,b,4,cl_c
    3,c,3,cl_c
    4,d,2,cl_c
    5,e,1,cl_c
    1,a,6,cl_d
    2,b,7,cl_d
    3,c,8,cl_d
    4,d,9,cl_d
    5,e,10,cl_d
    1,a,20,cl_e
    2,b,21,cl_e
    3,c,22,cl_e
    4,d,23,cl_e
    5,e,24,cl_e
    

    到目前为止,以下代码完成了这项工作

    df = pd.DataFrame ( {'cl_a': [1,2,3,4,5], 'cl_b': ['a','b','c','d','e'],
                            'cl_c': [5,4,3,2,1],'cl_d': [6,7,8,9,10],
                             'cl_e': [20,21,22,23,24]})
    
    df_new = pd.DataFrame()
    for col_name in ['cl_c','cl_d','cl_e']:
        df_new=df_new.append (df [['cl_a', 'cl_b', col_name]].rename(columns={col_name: "ax"}))
    

    在得到回答后,我意识到有必要增加另一个专栏(即。, from_col 斧头 . 这个 从\u列 指明来源 上一个列名。

    1 回复  |  直到 4 年前
        1
  •  1
  •   Quang Hoang    4 年前

    melt

    df.melt(['cl_a','cl_b'], value_name='ax').drop(columns='variable')
    

    输出:

        cl_a cl_b  ax
    0      1    a   5
    1      2    b   4
    2      3    c   3
    3      4    d   2
    4      5    e   1
    5      1    a   6
    6      2    b   7
    7      3    c   8
    8      4    d   9
    9      5    e  10
    10     1    a  20
    11     2    b  21
    12     3    c  22
    13     4    d  23
    14     5    e  24
    

    set_index().stack() :

    (df.set_index(['cl_a','cl_b']).stack()
       .reset_index(level=-1, drop=True)
       .reset_index(name='ax')
    )
    

        cl_a cl_b  ax
    0      1    a   5
    1      1    a   6
    2      1    a  20
    3      2    b   4
    4      2    b   7
    5      2    b  21
    6      3    c   3
    7      3    c   8
    8      3    c  22
    9      4    d   2
    10     4    d   9
    11     4    d  23
    12     5    e   1
    13     5    e  10
    14     5    e  24