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

使用Python Pandas筛选CSV中同时挂科B&C或B&D的学生记录

解决方案

原代码存在的问题

  • 列名大小写不匹配:CSV中的列名是Roll、Pass_Fail,代码里误用了小写的roll、pass_fail,会导致找不到列报错
  • 循环逻辑错误:for each roll in dataFrame实际是遍历DataFrame的列名,而非学生的Roll编号
  • 索引用法错误:dataFrame.loc['pass_fail']是按行索引取值,正确的列筛选应该是dataFrame['Pass_Fail'] == 'F'

正确实现步骤

通过Pandas的分组和筛选功能可以高效实现需求,步骤如下:

  1. 读取并筛选挂科记录:先提取所有挂科(Pass_Fail为F)的记录,减少后续处理的数据量
  2. 分组统计挂科科目:按学生的Roll号分组,收集每个学生挂科的科目集合
  3. 筛选目标学生:找出挂科科目同时包含B&C,或者B&D的学生Roll号
  4. 提取目标记录:从挂科记录中筛选出这些学生的所有挂科条目

完整代码

import pandas as pd

# 读取CSV文件,用原始字符串避免路径转义问题
df = pd.read_csv(r".\students.csv")

# 1. 筛选所有挂科的记录
failed_records = df[df['Pass_Fail'] == 'F']

# 2. 按Roll分组,收集每个学生挂科的科目集合
failed_subjects = failed_records.groupby('Roll')['Subject'].apply(set)

# 3. 找出符合条件的学生Roll:同时挂科B&C 或 B&D
target_rolls = failed_subjects[
    (failed_subjects >= {'B', 'C'}) | 
    (failed_subjects >= {'B', 'D'})
].index

# 4. 提取目标学生的挂科记录,并按Roll排序(可选,让输出更整齐)
result = failed_records[failed_records['Roll'].isin(target_rolls)].sort_values('Roll')

# 输出结果,去掉索引和表头,匹配预期格式
print(result.to_csv(index=False, header=False))

输出结果

2,B,30,F
2,C,30,F
3,B,30,F
3,D,20,F

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 06:50:32