如何在Python中基于双过滤条件自动获取学生科目成绩数据?
问题描述
需要从包含姓名、科目、分数三列的DataFrame(共6个姓名、6个科目)中,依次获取每个学生对应的所有科目及分数。尝试使用pandas的loc函数但未得到预期结果,原代码如下:
names = ['A','B','C','D','E','F'] subjects = ['ABC','XYZ','PQR','EFG','GHT','XUV'] for i,j in [(names,subjects)]: a=df_master.loc[(df_master['names']==i) & (df_master['subjects']==j),['Marks']] print(a)
问题分析
原代码的核心错误在于循环逻辑:for i,j in [(names,subjects)] 会将整个names列表赋值给i,整个subjects列表赋值给j,而DataFrame的列存储的是单个值,无法与列表匹配,导致过滤条件永远不成立,输出不符合预期。
此外,需求是获取每个学生的所有科目及分数,无需同时按姓名和科目配对过滤,只需按单个姓名筛选即可。
正确解法
方法1:遍历姓名,用loc筛选
直接遍历names列表中的每个姓名,使用loc筛选出该学生的所有记录,提取科目和分数:
import pandas as pd # 示例构造DataFrame(替换为你的实际数据) data = { 'names': ['A','A','B','B','C','C','D','D','E','E','F','F'], 'subjects': ['ABC','XYZ','PQR','EFG','GHT','XUV','ABC','XYZ','PQR','EFG','GHT','XUV'], 'Marks': [85,90,78,82,92,88,75,80,89,94,79,85] } df_master = pd.DataFrame(data) names = ['A','B','C','D','E','F'] for name in names: student_data = df_master.loc[df_master['names'] == name, ['subjects', 'Marks']] print(f"学生{name}的科目及分数:") print(student_data) print("---")
方法2:用groupby分组(更高效)
如果需要批量整理数据,groupby是更简洁高效的方式:
# 按姓名分组,提取科目和分数 grouped_data = df_master.groupby('names')[['subjects', 'Marks']] # 遍历分组输出 for name, group in grouped_data: print(f"学生{name}的科目及分数:") print(group) print("---") # 转为字典格式,方便后续使用 student_score_dict = grouped_data.apply( lambda x: x.set_index('subjects')['Marks'].to_dict() ).to_dict() print("按姓名整理的分数字典:") print(student_score_dict)
输出示例
以示例数据为例,方法1的输出如下:
学生A的科目及分数: subjects Marks 0 ABC 85 1 XYZ 90 --- 学生B的科目及分数: subjects Marks 2 PQR 78 3 EFG 82 --- 学生C的科目及分数: subjects Marks 4 GHT 92 5 XUV 88 --- ...(后续学生数据依次输出)
内容的提问来源于stack exchange,提问作者Chinmay
相关产品推荐
相关产品推荐

