同一DataFrame内列映射:如何将重复列数据转换为指定格式?
更简便的一次性处理方案
当然有比拆分再合并更高效的方法!我们可以借助pandas的数据重塑工具,把重复列的结构一次性转换成目标格式,步骤非常清晰:
步骤1:识别并配对重复列
因为Python自动给重复的Students列加上了.1、.2后缀,我们可以循环遍历每一组(Students, ScoreN)列,把它们提取出来统一列名,并标记对应的分数类型(比如Score1、Score2):
import pandas as pd # 先假设你的原始DataFrame是df dfs_list = [] # 遍历3组学生-分数列 for idx in range(3): # 确定当前组的学生列和分数列名 student_col = "Students" if idx == 0 else f"Students.{idx}" score_col = f"Score{idx+1}" # 提取当前组的两列,重命名为统一的列名,并标记分数类型 temp_df = df[[student_col, score_col]].rename(columns={student_col: "Students", score_col: "Score"}) temp_df["Score_Type"] = score_col dfs_list.append(temp_df)
步骤2:合并成长格式DataFrame
把所有分组的小DataFrame合并成一个长格式的表,这样每个行就对应一个学生的某一项分数:
long_format_df = pd.concat(dfs_list, ignore_index=True)
步骤3:透视转成目标宽格式
用pivot_table(或者pivot)把长格式转成我们需要的宽格式,每个学生一行,三个分数列对应各自的数值:
result_df = long_format_df.pivot_table( index="Students", columns="Score_Type", values="Score", aggfunc="first" # 因为每个学生每个分数只有一个值,用first即可 ).reset_index() # 去掉列名的层级,让格式更干净 result_df.columns.name = None
运行完这些代码,你就能直接得到目标格式的DataFrame啦!这种方法不需要手动拆分再合并,逻辑更清晰,也更容易维护,如果以后有更多的Score列,只需要修改循环的次数就行。
内容的提问来源于stack exchange,提问作者Devin Lee
相关产品推荐
相关产品推荐

