Pandas存在重复值时如何行转列生成多列成绩的宽表
解决方案
你报错的核心原因是直接做变形时,name+school的组合下存在多条重复记录,没有唯一的列标识用于匹配,因此会触发重复索引报错。你可以先给同一个分组下的成绩加序号作为列后缀,再做宽表转换即可:
完整实现代码
# 1. 给每个name分组下的成绩添加序号(1、2、3...),用作后续的列后缀 df['mark_seq'] = df.groupby(['name', 'school']).cumcount().add(1) # 2. 执行长表转宽表,给列名添加marks_前缀 df = df.pivot(index=['name', 'school'], columns='mark_seq', values='marks')\ .add_prefix('marks_')\ .reset_index() # 3. 清除列名上方的冗余索引名 df = df.rename_axis(None, axis=1) # 如果需要把空值替换为空字符串,可额外加这一行 # df = df.fillna('')
运行后即可得到你需要的目标格式:
| name | school | marks_1 | marks_2 | marks_3 |
|---|---|---|---|---|
| tom | HBS | 55 | 55 | 14 |
| mark | HBS | 28 | 19 | NaN |
| lewis | HBS | 88 | NaN | NaN |
内容的提问来源于stack exchange,提问作者hacaho
相关产品推荐
相关产品推荐

