如何在Python中基于Student ID合并/堆叠多份纵向学校数据集?
纵向学校数据合并解决方案
问题1:合并"test scores"子集的年度文件
假设你的四个年度文件命名规则为test_scores_2016.csv、test_scores_2017.csv、test_scores_2018.csv、test_scores_2019.csv,可以用pandas按以下步骤合并:
- 导入依赖库
import pandas as pd import os
- 遍历年度文件,添加年份列并收集数据
# 定义年份列表和文件路径(根据你的实际路径调整) years = [2016, 2017, 2018, 2019] data_dir = "./test_scores_data/" # 你的文件所在目录 test_scores_list = [] for year in years: # 拼接文件路径 file_path = os.path.join(data_dir, f"test_scores_{year}.csv") # 读取文件 df = pd.read_csv(file_path) # 添加Year列,标记当前文件对应的年份 df["Year"] = year # 将当前年度数据加入列表 test_scores_list.append(df) # 堆叠合并所有年度数据 merged_test_scores = pd.concat(test_scores_list, ignore_index=True)
执行后会得到按Student ID和Year堆叠的数据集,每个学生的各年度考试成绩按行排列。
问题2:合并"achievement"子集的grade level字段
假设achievement子集的文件为achievement_data.csv,分两种场景处理:
场景1:grade level是学生固定属性(不随年度变化)
直接基于Student ID关联合并:
# 读取achievement数据 achievement_df = pd.read_csv("./achievement_data.csv") # 合并数据集,保留test_scores的所有行,匹配不到的grade level会显示NaN final_df = pd.merge(merged_test_scores, achievement_df, on="Student ID", how="left")
场景2:grade level随年度变化(每个学生每年对应不同年级)
先按问题1的方法合并achievement的年度文件(添加Year列),再基于Student ID+Year双字段关联:
# 先合并achievement的年度文件 achievement_list = [] for year in years: file_path = os.path.join("./achievement_data/", f"achievement_{year}.csv") df = pd.read_csv(file_path) df["Year"] = year achievement_list.append(df) merged_achievement = pd.concat(achievement_list, ignore_index=True) # 双字段关联合并 final_df = pd.merge(merged_test_scores, merged_achievement, on=["Student ID", "Year"], how="left")
合并完成后,数据集会包含Student ID、Year、Test Score、grade level等所有目标字段。
内容的提问来源于stack exchange,提问作者Johnn-1231
相关产品推荐
相关产品推荐

