You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.11 03:42:04