代码之家  ›  专栏  ›  技术社区  ›  Marcio Lino

在Pandas中转换多个值列

  •  0
  • Marcio Lino  · 技术社区  · 10 月前

    我有以下pandas数据帧,我想对其进行转置。

    年份 CD_PRD VL_JAN VL_FEB VL_MAR VL_APR
    2022 CD76 10000 8000 170000 58000
    2022 CD92 15000 7500 86000 1200
    2023 CD76 8000 12000 15000 5000
    2023 CD92 12000 4560 10480 15600
    2024 CD76 400 8000 45800 120
    2024 CD92 56000 10200 150000 1500

    我需要的是将值列名称(例如(VL_JAN|VL_FEB|VL_MAR|VL_APR)转换为行,并将行(CD-PRD)转换为行将在末尾具有以下数据帧:

    年份 VL_CD76 VL_CD92
    2022 10000 15000
    2022 功能电子块 8000 7500
    2022 宗教硕士 170000 86000
    2022 ABR 58000 1200
    2023 8000 12000
    2023 功能电子块 12000 4560
    2023 宗教硕士 15000 10480
    2023 ABR 5000 15600
    2024 400 56000
    2024 功能电子块 8000 10200
    2024 宗教硕士 45800 150000
    2024 ABR 120 1500

    我做了以下操作,但似乎我遗漏了一些东西,没有设法获得正确的数据帧结构。

    df3 = df2.pivot(index='YEAR', columns=['CD_PRD'], values=['VL_JAN', 'VL_FEB', 'VL_MAR', 'VL_APR']).reset_index()
    print(df3)
    

    任何帮助都将是惊人的。谢谢!

    马西奥

    1 回复  |  直到 10 月前
        1
  •  0
  •   PaulS    10 月前

    一种可能的解决方案,其步骤如下:

    • 第一步是设置数据帧的索引 df 到列 YEAR CD_PRD 使用 set_index 方法。

    • 那么 stack 方法用于将列转换为行,从而创建层次索引。

    • 这个 unstack 然后应用该方法将索引的最内层转换回列中。

    • 这个 reset_index 方法用于重置数据帧的索引,将索引转换回列。

    • 这个 rename_axis 方法用于删除轴的名称。

    • 这个 set_axis 方法用于将数据帧的列重命名为列表 colnames .

    • 最后,the pipe 方法用于应用一个lambda函数,该函数使用 assign 创建新列的方法 MONTH 通过删除前缀 VL_ 从中的值 月份 列使用 str.replace 方法。

    colnames = ['YEAR', 'MONTH', 'VL_CD76', 'VL_CD92']
    
    (df.set_index(['YEAR', 'CD_PRD']).stack()
     .unstack(1).reset_index().rename_axis(None, axis=1)
     .set_axis(colnames, axis=1)
     .pipe(lambda x: x.assign(MONTH = x['MONTH'].str.replace('VL_', ''))))
    

    输出:

        YEAR MONTH  VL_CD76  VL_CD92
    0   2022   JAN    10000    15000
    1   2022   FEB     8000     7500
    2   2022   MAR   170000    86000
    3   2022   APR    58000     1200
    4   2023   JAN     8000    12000
    5   2023   FEB    12000     4560
    6   2023   MAR    15000    10480
    7   2023   APR     5000    15600
    8   2024   JAN      400    56000
    9   2024   FEB     8000    10200
    10  2024   MAR    45800   150000
    11  2024   APR      120     1500