python - 如何使用 Pandas 中的模块 melt 有效地熔化多个列?
问题描述
目标是取消透视下表
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 m2
andm3
并同时合并结果。这是因为,实际上,m_i 和 t_i 这对在数百的范围内(其中 i 是索引)
但是,我想知道有比循环更有效的方法。
ps 我曾尝试过OP中的建议,但是,它没有给出预期的输出
解决方案
如果我理解您的问题,您可以使用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
推荐阅读
- javascript - 消除
当它包含特定字符串时
- spring - spring-security-crypto jar 未在 ./m2/repository/ 中更新
- c - 将 fgetc 与标准输入指针一起使用。错误处理输入
- c# - 使用 LINQ 从属性元素返回 xml 子元素
- .net - 如何将字符串数组列表更改为字符串列表
- objective-c - 从 Objective-C 迁移到 Swift 并删除已转换的 Objective-C 文件
- jquery - toggleClass() 在 IE11 中不起作用,但似乎在所有其他浏览器中都起作用
- python - 如何在 Python 多进程中在父子之间共享队列
- c# - UWP Lumia VB.Net 视频效果
- angular - 角度 6 上的 firebase 错误