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

