You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 07:35:52