如何在Pandas DataFrame中无聚合结合melt、transpose和pivot函数?
问题:将DataFrame按位置列转行并保留完整数据
原始DataFrame:
| 使用位置 | 英雄 | 结果 | ID | 阵营 |
|---|---|---|---|---|
| 上单 | riven | 0 | 1 | 蓝色方 |
| 打野 | jax | 0 | 1 | 蓝色方 |
| 上单 | fiora | 1 | 1 | 红色方 |
| 打野 | lee sin | 1 | 1 | 红色方 |
| 上单 | mundo | 0 | 2 | 蓝色方 |
| 打野 | jax | 0 | 2 | 蓝色方 |
| 上单 | kayle | 1 | 2 | 红色方 |
| 打野 | olaf | 1 | 2 | 红色方 |
目标DataFrame:
| 上单 | 打野 | 结果 | ID | 阵营 |
|---|---|---|---|---|
| riven | jax | 0 | 1 | 蓝色方 |
| fiora | lee sin | 1 | 1 | 红色方 |
| mundo | jax | 0 | 2 | 蓝色方 |
| kayle | olaf | 1 | 2 | 红色方 |
遇到的问题
执行命令 df.pivot(['Result', 'ID', 'Side'], 'Position Played', 'Champion').reset_index() 时触发错误:
ValueError: 索引包含重复条目,无法重塑
且需要保留完整数据,不能使用sum、mean这类聚合操作。
解决方案
方法1:修正列名后使用pivot
报错核心原因是列名不匹配——代码里用了英文列名,但实际DataFrame是中文列名。改用中文列名执行pivot即可:
result_df = df.pivot(index=['结果', 'ID', '阵营'], columns='使用位置', values='英雄').reset_index() # 调整列顺序匹配目标格式 result_df = result_df[['上单', '打野', '结果', 'ID', '阵营']]
方法2:用pivot_table兼容潜在重复场景
如果后续数据中出现同一分组下同一位置的重复条目,可使用pivot_table搭配aggfunc='first'保留第一条数据,同时避免报错:
result_df = df.pivot_table( index=['结果', 'ID', '阵营'], columns='使用位置', values='英雄', aggfunc='first' ).reset_index() result_df = result_df[['上单', '打野', '结果', 'ID', '阵营']]
方法3:groupby + unstack组合
通过分组后展开列的方式实现,逻辑更直观:
result_df = df.groupby(['结果', 'ID', '阵营', '使用位置'])['英雄'].first()\ .unstack('使用位置')\ .reset_index() result_df = result_df[['上单', '打野', '结果', 'ID', '阵营']]
以上三种方法都能完整保留原始数据,最终输出与目标DataFrame一致。
内容的提问来源于stack exchange,提问作者Yumi
相关产品推荐
相关产品推荐

