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

如何按学生ID将DataFrame列转行?df.melt使用遇阻求解决

解决方案:将宽格式DataFrame转换为长格式

针对你的需求,我们可以使用Pandas的wide_to_long方法(最适合这种结构化列名的场景)或结合melt与pivot来实现列转行。以下是具体实现步骤:

方法一:使用pd.wide_to_long(推荐)

该方法专门处理带有前缀/后缀的结构化列名,代码更简洁:

import pandas as pd

# 读取Excel数据到DataFrame
df = pd.read_excel("your_excel_file.xlsx")

# 转换格式
result = pd.wide_to_long(
    df,
    stubnames=["Number", "Letter"],  # 列名中不变的部分
    i=["ID", "Grade", "Course"],     # 保持不变的标识列
    j="Semester",                    # 新生成的"学期"列名
    sep=" ",                         # 列名中前缀与后缀的分隔符(空格)
    suffix=".+"                      # 匹配后缀的正则表达式
).reset_index()

# 重命名列以匹配期望输出
result = result.rename(columns={
    "Number": "Number Grade",
    "Letter": "Letter Grade"
})

print(result)

方法二:结合melt与pivot

如果更习惯使用melt,可以按以下步骤操作:

import pandas as pd

df = pd.read_excel("your_excel_file.xlsx")

# 第一步:将所有成绩列转为行
melted_df = df.melt(
    id_vars=["ID", "Grade", "Course"],
    var_name="Variable",
    value_name="Value"
)

# 第二步:拆分"Variable"列为学期和成绩类型
melted_df[["Semester", "Grade_Type"]] = melted_df["Variable"].str.split(" ", expand=True)

# 第三步:将成绩类型转为列
final_df = melted_df.pivot_table(
    index=["ID", "Grade", "Course", "Semester"],
    columns="Grade_Type",
    values="Value",
    aggfunc="first"
).reset_index()

# 重命名列
final_df = final_df.rename(columns={
    "Number": "Number Grade",
    "Letter": "Letter Grade"
})

print(final_df)

两种方法最终都会生成你期望的输出结构。

内容的提问来源于stack exchange,提问作者user19435923

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 10:15:41