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

Python中如何将含空单元格的多行数据合并为单条完整行?

学生测试学科数据规整实现方案

需求说明

处理三类科目学生测试数据集,将同一学生、同一测试日期、同一学科拆分在多行的记录合并,最终实现每个学生对应单个学科单条记录的格式。

原始数据集结构

StudentTestID   TestDate    SubjectName 1Label      1Value  2Label 2Value   
1000077         1-May       Math        Perf Level  3-NI                        
1000077         1-Apr       ELA         Perf Level  2-W                     
1000077         1-Jun       Science     Perf Level                              
1000077         1-May       Math                            Scaled 232          
1000077         1-Apr       ELA                             Scaled 214          
1000077         1-Jun       Science                         Scaled              
1000078         1-May       Math        Perf Level  2-W                     
1000078         1-Apr       ELA         Perf Level  4-P+                        
1000078         1-Jun       Science     Perf Level                              
1000078         1-May       Math                            Scaled 221          
1000078         1-Apr       ELA                             Scaled 215          
1000078         1-Jun       Science                         Scaled          

期望输出结构

StudentTestID   TestDate    SubjectName 1Label      1Value  2Label 2Value   
1000077         1-May       Math        Perf Level  3-NI    Scaled 232                  
1000077         1-Apr       ELA         Perf Level  2-W     Scaled 214              
1000077         1-Jun       Science     Perf Level          Scaled                  
1000078         1-May       Math        Perf Level  2-W     Scaled 221                  
1000078         1-Apr       ELA         Perf Level  4-P+    Scaled 215              
1000078         1-Jun       Science     Perf Level          Scaled  

已尝试的无效写法

之前尝试的groupby、join相关写法均未得到预期结果,代码如下:

df.groupby(['SubjectName'])
df.groupby(['StudentTestID'])
edf.join(edf.set_index('SubjectName'), on='SubjectName')

正确实现代码

之前写法无效的核心原因是分组维度不全,且没有做同组非空值聚合,不需要复杂join操作,直接按唯一主键分组取非空值即可。
唯一确定单条记录的主键为三个字段:StudentTestID(学生ID)、TestDate(测试日期)、SubjectName(科目名称),按这三个字段分组后,对成绩相关字段取组内第一个非空值,就能自动把拆分在两行的成绩等级、量表分合并到同一行。

import pandas as pd

# 分组聚合合并同一场次同一学科的拆分记录
df_merged = df.groupby(
    by=['StudentTestID', 'TestDate', 'SubjectName'],
    as_index=False,
    dropna=False
)[['1Label', '1Value', '2Label', '2Value']].first()

# 调整列顺序和原表保持一致
df_merged = df_merged[['StudentTestID', 'TestDate', 'SubjectName', '1Label', '1Value', '2Label', '2Value']]

提示:如果同组内同一个字段存在多个不同非空值,可根据业务需求将first()替换为last()、max()等其他聚合函数,当前示例数据使用first()输出结果和期望结构完全一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 19:09:19