【问题标题】:Pivoting dataframe for multiple targets/columns为多个目标/列旋转数据框
【发布时间】:2022-07-20 16:19:45
【问题描述】:

我有一个包含 6 列的数据框

date    col1    col2    t1    t2    t3    col3
12      23.2     23.2   100   200   300    1
13      34.2     12.2   10    223   122    2
14      32        12    10     20   100    3

我想将此数据框转换为:

date    col1    col2    t_day    t_val    col3
12       23.2   23.2     1        100      1
12       23.2   23.2     2        200      1
12       23.2   23.2     3        300      1
13       34.2   12.2     1        10       2
13       34.2   12.2     2        223      2
13       34.2   12.2     3        122      2
14       32     12       1        10       3
14       32     12       1        20       3
14       32     12       1        100      3

需要以匹配 't*' 的所有列为中心,以便所有列 t1、t2、t3、.. 都可以进行旋转。 你能帮忙吗?

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    IIUC,你需要自定义melt

    cols = df.filter(regex='^t').columns.to_list()
    # ['t1', 't2', 't3']
    
    out = (df.melt(id_vars=df.columns.difference(cols),
                   var_name='t_day', value_name='t_val')
             .assign(t_day=lambda d: d['t_day'].str[1:])
          )
    

    输出:

       col1  col2  col3  date t_day  t_val
    0  23.2  23.2     1    12     1    100
    1  34.2  12.2     2    13     1     10
    2  32.0  12.0     3    14     1     10
    3  23.2  23.2     1    12     2    200
    4  34.2  12.2     2    13     2    223
    5  32.0  12.0     3    14     2     20
    6  23.2  23.2     1    12     3    300
    7  34.2  12.2     2    13     3    122
    8  32.0  12.0     3    14     3    100
    

    stack 的变体:

    cols = df.filter(regex='^t').columns.to_list()
    # ['t1', 't2', 't3']
    
    (df.set_index(df.columns.difference(cols).to_list())
       .rename_axis('t_day', axis=1)
       .stack()
       .reset_index(name='t_val')
       .assign(t_day=lambda d: d['t_day'].str[1:])
    )
    

    输出:

       col1  col2  col3  date t_day  t_val
    0  23.2  23.2     1    12     1    100
    1  23.2  23.2     1    12     2    200
    2  23.2  23.2     1    12     3    300
    3  34.2  12.2     2    13     1     10
    4  34.2  12.2     2    13     2    223
    5  34.2  12.2     2    13     3    122
    6  32.0  12.0     3    14     1     10
    7  32.0  12.0     3    14     2     20
    8  32.0  12.0     3    14     3    100
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-10-15
      • 1970-01-01
      • 2019-11-14
      • 2017-08-22
      • 2014-01-16
      • 2020-02-07
      • 1970-01-01
      相关资源
      最近更新 更多