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
相关产品推荐
相关产品推荐

