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

