Pandas如何基于多索引将多行数据合并为单行
实现方法
直接用pd.pivot()无法同时完成「课程名+成绩」双字段的配对展开,你要的单行转换代码(含列名格式化,直接输出你要的目标结构)如下:
df_result = df.set_index(['FirstName','LastName', df.groupby(['FirstName','LastName']).cumcount()+1]).unstack().sort_index(axis=1, level=1).pipe(lambda x: x.set_axis([f'{col}{seq}' for col, seq in x.columns], axis=1)).reset_index()
逻辑说明
- 先按
FirstName+LastName对学生分组,给同一名学生的所有课程按原始顺序生成从1开始的序号 - 将姓名、课程序号设为索引后,通过
unstack()把不同序号对应的课程名、成绩横向展开为列 - 按课程序号层级排序,保证同序号的
CourseName和CourseGrade相邻,不会出现列错位 - 最后把多层列名拼接为
CourseName1/CourseGrade1这类目标命名,重置索引后就得到结果
用你提供的样例数据运行,输出完全匹配预期:
FirstName LastName CourseName1 CourseGrade1 CourseName2 CourseGrade2 0 Joseph Hanso CS101 A+ CS102 D
如果不需要提前格式化列名,仅获取核心宽表结构可以用更短的版本:
df_result = df.set_index(['FirstName','LastName', df.groupby(['FirstName','LastName']).cumcount()+1]).unstack().sort_index(axis=1, level=1).reset_index()
内容的提问来源于stack exchange,提问作者Mohamed Taher Alrefaie
相关产品推荐
相关产品推荐

