Python:分类DataFrame重排问题技术求助
解决DataFrame重排:将学生的两门科目拆分为两列
嘿,我完全懂你的困扰!pivot方法确实要求指定值字段,但咱们换个思路就能搞定——既然每个学生只选修两门科目,核心目标就是按学生分组,把他们的两门科目拆成独立的两列。我给你举个具体的例子,一步步实现:
第一步:先构造示例输入(方便你对应自己的数据)
假设你的原始DataFrame长这样:
import pandas as pd df = pd.DataFrame({ '学生ID': ['001', '001', '002', '002', '003', '003'], '科目': ['数学', '英语', '语文', '数学', '英语', '语文'] })
方法一:用groupby+聚合拆分列
这种方法简洁直接,先按学生分组把科目聚合成列表,再把列表拆成两列:
# 按学生ID分组,将科目聚合成列表后拆分为两列 result = df.groupby('学生ID')['科目'].agg(list).apply(pd.Series) # 给列重命名,更直观 result.columns = ['科目1', '科目2'] # 把学生ID从索引变回普通列(可选,根据你的需求) result = result.reset_index()
方法二:用pivot_table配合序号(完美适配你提到的pivot类方法)
如果你更想用类似pivot的逻辑,可以先给每个学生的科目添加序号(1和2),再用pivot_table转换:
# 给每个学生的科目生成序号(1、2,因为每人只有两门) df['科目序号'] = df.groupby('学生ID').cumcount() + 1 # 用pivot_table转换,值字段就是科目本身,聚合函数用first(每个序号对应唯一科目) result = df.pivot_table( index='学生ID', columns='科目序号', values='科目', aggfunc='first' ).reset_index() # 重命名列,去掉序号的列名前缀 result.columns = ['学生ID', '科目1', '科目2']
两种方法最终得到的结果都是类似这样的(科目顺序无关,符合你的需求):
学生ID 科目1 科目2 0 001 数学 英语 1 002 语文 数学 2 003 英语 语文
内容的提问来源于stack exchange,提问作者user27074
相关产品推荐
相关产品推荐

