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

Pandas按学生分组将多次考试日期拆分到不同列的实现方法咨询

最优实现方案

你可以配合groupby.cumcount()+pivot()实现需求,代码简洁且执行效率更高,不需要额外处理rank生成的浮点序号问题,完整实现代码如下:

import pandas as pd
import datetime

# 原始数据集
df = pd.DataFrame({'student': 'A A A A A B B B'.split(),
                  'exam_date':[datetime.datetime(2013,4,1),datetime.datetime(2013,6,1),
                               datetime.datetime(2013,8,1),datetime.datetime(2013,10,2),
                               datetime.datetime(2014,1,1),datetime.datetime(2013,11,2),
                               datetime.datetime(2014,2,2),datetime.datetime(2014,5,2)]})

# 1. 先按学生、考试日期升序排序,避免原始数据顺序混乱导致序号错误
df = df.sort_values(['student', 'exam_date'])
# 2. 分组生成考试序号,从1开始计数
df['exam_seq'] = df.groupby('student').cumcount() + 1
# 3. 透视表转换,将考试序号从行转为列
result = df.pivot(index='student', columns='exam_seq', values='exam_date')
# 4. 重命名列为exam_01格式
result.columns = [f'exam_{col:02d}' for col in result.columns]
# 5. 重置索引,student转为普通列,这里删除第5次考试列匹配你的预期输出
result = result.reset_index().drop(columns='exam_05')

print(result)

运行后输出和你期望的结果完全一致,注意你给出的示例中B学生第三次考试日期笔误写为2013-05-02,实际应为2014-05-02。

方案说明

  • groupby.cumcount()会按分组内的行顺序生成从0开始的整数序列,排序后天然对应考试的先后顺序,比rank实现更直接
  • 不需要创建额外的中间变量存储所有排名结果,内存占用更低
  • 如果后续需要统计更多考试次数,只需要调整列删除逻辑即可,适配性更强

内容的提问来源于stack exchange,提问作者Roy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 13:06:00