【问题标题】:How to melt 2 columns at the same time?如何同时熔化 2 根柱子?
【发布时间】:2019-09-10 00:04:49
【问题描述】:

在 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'})

会很棒。

【问题讨论】:

    标签: python python-3.x pandas


    【解决方案1】:

    这是wide_to_long

    pd.wide_to_long(df,['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
    

    【讨论】:

    • 哪个部分使它选择(t1,l1)和(t2,l2),而不是(t1,t2)和(l1,l2)。它是否取决于列在数据框中出现的顺序?如果是这样,我可以指定顺序吗?谢谢。
    【解决方案2】:

    您可以在这里使用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
    

    【讨论】:

      猜你喜欢
      • 2015-01-23
      • 2020-09-24
      • 2019-02-16
      • 2021-05-26
      • 1970-01-01
      • 2018-12-11
      相关资源
      最近更新 更多