Python pandas如何保留指定列的同时将多列转为行(宽表转长表)
实现方案
你需要的宽表转长表操作可以直接用pandas内置的melt方法实现,你之前用pivot、transpose没得到结果是因为这两个方法不是专门处理这类列转行的场景,melt是对应这类需求的原生API。
代码示例
首先导入pandas,再执行转换操作即可:
import pandas as pd # 此处替换为你自己读取的原始DataFrame即可 # 以下为模拟原始数据结构的示例代码 df = pd.DataFrame({ "EmpID": [1001, 1002, 1003], "Goal": ["完成业绩100万", "完成业绩80万", "完成业绩120万"], "week 1": [20, 15, 25], "week 2": [25, 18, 30], "week 3": [30, 22, 35], "week 4": [28, 25, 32] }) # 执行宽转长核心操作 long_df = df.melt( id_vars=["EmpID", "Goal"], # 指定不需要变动、需要保留的固定列 value_vars=["week 1", "week 2", "week 3", "week 4"], # 指定需要转为行的周数据列 var_name="Weeks", # 转换后存储周标识的列名,对应你的要求 value_name="Actual" # 转换后存储周数值的列名,对应你的要求 )
优化说明
如果你的周列数量不固定,不需要手动枚举所有周列,可以通过列名规则自动匹配:
# 自动筛选所有以week开头的列作为要转换的列 week_cols = [col for col in df.columns if col.startswith("week")] long_df = df.melt( id_vars=["EmpID", "Goal"], value_vars=week_cols, var_name="Weeks", value_name="Actual" )
注意事项
- 如果原始数据存在空的周数值,转换后空值会保留在Actual列,可根据需要用
long_df = long_df.dropna(subset=["Actual"])删除空值行。 - 转换后周列的顺序默认和原表周列的顺序一致,如果需要按周排序,可以补充
long_df = long_df.sort_values(by=["EmpID", "Weeks"])调整顺序。
内容的提问来源于stack exchange,提问作者itskcl
相关产品推荐
相关产品推荐

