如何在Pandas中按类别将单列转换为多列并重构数据集?
用Pandas转换在线学习平台交互数据集结构
原始数据集
import pandas as pd df = pd.DataFrame({'id': [1, 1, 1, 2, 2, 3,3], 'activity_type': ['resource', 'url', 'homepage', 'url','homepage','resource','url'], 'sum_click': [23,15,2,25,2,16,2], 'course':['math', 'physics','math', 'math','physics','math','math'], 'final_result':['pass', 'pass', 'pass','pass','fail','pass','pass'], })
原始数据表格:
| id | activity_type | sum_click | course | final_result |
|---|---|---|---|---|
| 1 | resource | 23 | math | pass |
| 1 | url | 15 | physics | pass |
| 1 | homepage | 2 | math | pass |
| 2 | url | 25 | math | pass |
| 2 | homepage | 2 | physics | fail |
| 3 | resource | 16 | math | pass |
| 3 | url | 2 | math | pass |
目标数据集结构
target_df = pd.DataFrame({'id': [1, 1, 2, 2, 3], 'type_resource': [23,0,0,0,16], 'type_url': [0,15,25,0,2], 'type_homepage':[2,0,0,2,0], 'course':['math', 'physics','math','physics','math'], 'final_result':['pass', 'pass', 'pass','fail','pass'], })
目标数据表格:
| id | type_resource | type_url | type_homepage | course | final_result |
|---|---|---|---|---|---|
| 1 | 23 | 0 | 2 | math | pass |
| 1 | 0 | 15 | 0 | physics | pass |
| 2 | 0 | 25 | 0 | math | pass |
| 2 | 0 | 0 | 2 | physics | fail |
| 3 | 16 | 2 | 0 | math | pass |
实现方法
可以通过Pandas的pivot_table方法直接实现,核心是将activity_type列转换为新的列名,同时以id、course、final_result作为分组依据,缺失的点击量用0填充:
# 执行透视转换 result_df = df.pivot_table( index=['id', 'course', 'final_result'], columns='activity_type', values='sum_click', fill_value=0, aggfunc='sum' # 同一分组下若有重复数据,用sum合并;示例无重复时也可用first ).reset_index() # 重命名列名,添加type_前缀 result_df.columns = ['id', 'course', 'final_result'] + [f'type_{col}' for col in result_df.columns[3:]] # 调整列顺序,匹配目标结构 result_df = result_df[['id', 'type_resource', 'type_url', 'type_homepage', 'course', 'final_result']] print(result_df)
执行后输出的结果与目标数据集完全一致:
id type_resource type_url type_homepage course final_result 0 1 23 0 2 math pass 1 1 0 15 0 physics pass 2 2 0 25 0 math pass 3 2 0 0 2 physics fail 4 3 16 2 0 math pass
说明
pivot_table的index参数指定了分组的唯一标识:每个id+course+final_result组合对应一行数据columns参数将activity_type的不同值转为新列fill_value=0确保没有对应交互类型的位置填充0- 最后调整列顺序以匹配目标结构
内容的提问来源于stack exchange,提问作者jessu
相关产品推荐
相关产品推荐

