如何同时合并两个列?

5
在 Pandas 中,我有以下数据框:
   id1 id2 t1  l1  t2  l2 
0  1   2   a   b   c   d
1  3   4   g   h   i   j

我想要同时合并两列。也就是说,期望的输出结果是:
   id1 id2 tz  lz  
0  1   2   a   b
1  1   2   c   d
2  3   4   g   h
3  3   4   i   j

我知道标准的熔化方式:
d.melt(id_vars=['id1', 'id2'],
       value_vars=['t1', 't2', 'l1', 'l2'])

但那会堆叠所有的列

   id1  id2 variable value
0    1    2       t1     a
1    3    4       t1     g
2    1    2       t2     c
3    3    4       t2     i
4    1    2       l1     b
5    3    4       l1     h
6    1    2       l2     d
7    3    4       l2     j

我该如何同时合并两列?就像这样:

d.melt(id_vars=['id1', 'id2'],
       value_vars={('t1', 'l1'): 'tz', ('t2', 'l2'): 'lz'})

很不错。
2个回答

15

这是wide_to_long函数。

pd.wide_to_long(df, stubnames=['t','l'], i=['id1','id2'], j='drop').reset_index(level=[0,1])
Out[52]: 
      id1  id2  t  l
drop                
1       1    2  a  b
2       1    2  c  d
1       3    4  g  h
2       3    4  i  j

1
哪一部分使它选择(t1,l1)和(t2,l2),而不是(t1,t2)和(l1,l2)。 它是否取决于数据框中列出现的顺序? 如果是这样,我可以指定顺序吗?谢谢。 - hyperio
@hyperio,网址为https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.wide_to_long.html ,这里是stubnames。 - BENY

5

您可以在此处两次使用 melt,然后将它们连接起来以获得所需的输出:

t = d.melt(id_vars=['id1', 'id2'], value_vars=['t1', 't2'], value_name='tz').drop('variable', axis=1)
l = d.melt(id_vars=['id1', 'id2'], value_vars=['l1', 'l2'], value_name='lz').iloc[:, -1:]

df = pd.concat([t, l], axis=1).sort_values('id1')

输出

print(df)
   id1  id2 tz lz
0    1    2  a  b
2    1    2  c  d
1    3    4  g  h
3    3    4  i  j

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