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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 03:47:50