如何用Pandas实现DataFrame透视转置?附转换需求及尝试记录
Pandas 表格数据转置重组解决方案
问题描述
原始数据集:
Period Course Teacher 0 1 Sci Teach1 1 2 Art Teach1 2 H Span Teach1 3 1 PE Teach2 4 2 CS Teach2 5 H Conf Teach2 6 1 AP Art Teach3 7 2 Dig Art Teach3 8 H Health Teach3
期望转换后的结构:
Teacher H P1 P2 0 Teacher1 Span Sci Art 1 Teacher2 Conf PE CS 2 Teacher3 Health AP Art Dig Art
尝试操作及遇到的问题:
- 使用
df.transpose()得到的结果不符合需求,输出如下:
0 1 2 ... 6 7 8 Period 1 2 H ... 1 2 H Course Sci Art Span ... AP Art Dig Art Health Teacher Teach1 Teach1 Teach1 ... Teach3 Teach3 Teach3
- 使用
df.groupby(['Teacher'])时出现报错:grouper, exclusions, obj = get_grouper - 搜索过
pivot、melt、transform等方法,但未找到匹配示例
解决方案
你需要的是**数据透视(pivot)**操作,同时对Period列的取值做重命名处理,具体步骤如下:
1. 加载原始数据
先确保DataFrame正确加载,示例代码:
import pandas as pd data = { 'Period': ['1', '2', 'H', '1', '2', 'H', '1', '2', 'H'], 'Course': ['Sci', 'Art', 'Span', 'PE', 'CS', 'Conf', 'AP Art', 'Dig Art', 'Health'], 'Teacher': ['Teach1', 'Teach1', 'Teach1', 'Teach2', 'Teach2', 'Teach2', 'Teach3', 'Teach3', 'Teach3'] } df = pd.DataFrame(data)
2. 重命名Period列的取值
把Period中的1改为P1,2改为P2,保持H不变:
df['Period'] = df['Period'].replace({'1': 'P1', '2': 'P2'})
3. 使用pivot_table实现重组
用pivot_table按Teacher分组,将修改后的Period作为列,Course作为单元格值:
result = df.pivot_table(index='Teacher', columns='Period', values='Course', aggfunc='first').reset_index()
index='Teacher':指定行索引为教师姓名columns='Period':指定列名为修改后的Period值values='Course':填充单元格的内容为Course列的值aggfunc='first':因每个教师对应每个Period仅一条数据,用first确保取到唯一值reset_index():将Teacher从索引转为普通列
4. 调整列顺序(可选)
如果需要按Teacher、H、P1、P2的顺序排列列:
result = result[['Teacher', 'H', 'P1', 'P2']]
最终输出
运行上述代码后,result的结构与期望完全一致:
Teacher H P1 P2 0 Teach1 Span Sci Art 1 Teach2 Conf PE CS 2 Teach3 Health AP Art Dig Art
关于groupby报错的说明
之前用groupby报错是因为仅执行了分组操作,未搭配聚合函数(如first、sum等),groupby只是分组容器,必须结合聚合逻辑才能生成结果,而pivot_table更适配这种行列转换的场景。
内容的提问来源于stack exchange,提问作者Steve Gutierrez
相关产品推荐
相关产品推荐

