如何按学生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
相关产品推荐
相关产品推荐

