将多列堆叠成单列,同时在 Pandas 中维护其他列?

Stack multiple columns into single column while maintaining other columns in Pandas?

给定 pandas 如下多列

    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"}))

不过,我很好奇是否有 Pandas 内置方法可以做到这一点

编辑: 根据 Quong 的回答,我意识到需要在 ax 旁边包括另一列(即 from_col)。 from_col 表示 ax 前一列名称的来源。

是的,它叫做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