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

Pandas:合并学生同一科目连续相同分数的月度记录

问题

我有一份学生多年各学科的月度成绩数据,DataFrame包含Name, Subject, Month, Year, Marks列,数据示例如下:

Name  Month  Year Subject  Marks
0    A      1  2022    Math     80
1    A      2  2022    Math     80
2    A      3  2022    Math     80
3    A      4  2022    Math     70
4    A      5  2022    Math     80
5    A      6  2022    Math     80
6    A      7  2022    Math     80

需要按学生和科目,合并连续分数相同的行,生成如下结果:

Name Subject  Marks    Time_Period
0    A    Math     80  1.2022-3.2022
1    A    Math     70  4.2022-4.2022
2    A    Math     80  5.2022-7.2022

之前尝试直接分组提取Min/Max(Month)和Min/Max(Year),但中间出现不同分数时结果错误。

解决方法

核心思路是先给连续相同分数的行打上同一个分组标签,再按分组聚合。具体步骤:

  • 先按Name、Subject、Year、Month排序,确保数据按时间顺序排列(避免因数据乱序导致分组错误):

    df = df.sort_values(['Name', 'Subject', 'Year', 'Month'])
    
  • 创建连续分组标签:按学生和科目分组后,对比当前行与上一行的Marks,不同则生成新分组:

    df['group'] = df.groupby(['Name', 'Subject'])['Marks'].apply(lambda x: x.ne(x.shift()).cumsum())
    
  • 按Name、Subject、group、Marks聚合,提取每组的首尾时间并拼接成区间:

    result = df.groupby(['Name', 'Subject', 'group', 'Marks']).agg(
        start_time=lambda x: f"{x['Month'].min()}.{x['Year'].min()}",
        end_time=lambda x: f"{x['Month'].max()}.{x['Year'].max()}"
    ).reset_index()
    
    # 拼接时间区间列
    result['Time_Period'] = result['start_time'] + '-' + result['end_time']
    
    # 筛选并保留目标列
    result = result[['Name', 'Subject', 'Marks', 'Time_Period']]
    

运行上述代码后即可得到目标格式的结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 10:15:33