【问题标题】:How to efficiently melt multiple columns using the module melt in Pandas?如何使用 Pandas 中的模块 melt 有效地熔化多个列?
【发布时间】:2021-01-26 15:57:46
【问题描述】:

目标是还原下表

  Activity General  m1   t1  m2   t2  m3   t3
0       P1      AA  A1  TA1  A2  TA2  A3  TA3
1       P2      BB  B1  TB1  B2  TB2  B3  TB3

变成如下格式

    Activity   General M Task
0   P1 AA A1  TA1 
1   P1 AA A2  TA2 
2   P1 AA A3  TA3 
3   P2 BB B1  TB1 
4   P2 BB B2  TB2
5   P2 BB B3  TB3

根据一些阅读,melt 模块可用于实现预期目标。

import pandas as pd
from pandas import DataFrame
list_me = [['P1','AA','A1','TA1','A2','TA2','A3','TA3'],
           ['P2', 'BB', 'B1', 'TB1', 'B2', 'TB2', 'B3', 'TB3']]

df = DataFrame (list_me)
df.columns = ['Activity','General','m1','t1','m2','t2','m3','t3']   
melted_form=pd.melt(df, id_vars=['Activity','General'],var_name='m1',value_name='new_col')

但是,在网上找到的大多数示例仅用于处理单列。我正在考虑使用 for 循环来循环 m1 m2m3 并同时合并结果。这是因为,实际上,m_i 和 t_i 这对在数百的范围内(其中 i 是索引)

但是,我想知道还有比循环更有效的方法。

附言我曾尝试过OP 中的建议,但是它没有给出预期的输出

【问题讨论】:

    标签: python pandas pivot unpivot melt


    【解决方案1】:

    如果我理解您的问题,您可以使用pd.wide_to_long

        (pd.wide_to_long(df, 
                        i=["Activity", "General"], 
                        stubnames=["t", "m"], j="number")
        .set_axis(["Task", "M"], axis="columns")
        .droplevel(-1).reset_index()
         )
    
        Activity    General Task    M
    0      P1       AA      TA1     A1
    1      P1       AA      TA2     A2
    2      P1       AA      TA3     A3
    3      P2       BB      TB1     B1
    4      P2       BB      TB2     B2
    5      P2       BB      TB3     B3
    

    【讨论】:

    • 嗨@sammy,是的,正确理解了这个问题。如果您能在答案中解释更多关于tm 的选择,我们将不胜感激。
    • 我在答案中包含了该函数的链接。它主要查找以 tm 开头的列,并将它们分成单独的列;它们必须是前缀。
    • 嗨 Sam,很抱歉没有更早地包含此信息。但是,如果列是这些格式'Jan 2020','Feb 2020','Mar 2020','Apr 2020','May 2020','Jun 2020',如何处理stubnames。这个课程范围从 2020 年的 1 月到 12 月到 2050 年。感谢任何提示。此时,我正在考虑更改列名,使其以字母tm 开头。例如m Jan 2020 但是这样做是否可取?
    • 没问题。相同的概念适用;但是,您可以创建一个新问题,让我们看看是否有更简单的解决方案。
    猜你喜欢
    • 2019-01-02
    • 1970-01-01
    • 1970-01-01
    • 2019-11-30
    • 1970-01-01
    • 2021-10-05
    • 2020-11-21
    • 2021-05-12
    • 2018-09-23
    相关资源
    最近更新 更多