如何使用 Pandas 中的模块 melt 高效地熔化多列?
How to efficiently melt multiple columns using the module melt in Pandas?
objective 是对下面的 table
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
可用于实现所需的 objective。
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 m2
和 m3
并同时合并结果。这是因为,实际上,m_i 和 t_i 这对的范围是数百(其中 i 是索引)
但是,我想知道还有比循环更有效的方法。
p.s。我曾尝试过 中的建议,但是,它没有给出预期的输出
如果我理解你的问题,你可以使用 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
objective 是对下面的 table
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
可用于实现所需的 objective。
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 m2
和 m3
并同时合并结果。这是因为,实际上,m_i 和 t_i 这对的范围是数百(其中 i 是索引)
但是,我想知道还有比循环更有效的方法。
p.s。我曾尝试过
如果我理解你的问题,你可以使用 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