使用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的分组和筛选功能可以高效实现需求,步骤如下:
- 读取并筛选挂科记录:先提取所有挂科(
Pass_Fail为F)的记录,减少后续处理的数据量 - 分组统计挂科科目:按学生的
Roll号分组,收集每个学生挂科的科目集合 - 筛选目标学生:找出挂科科目同时包含
B&C,或者B&D的学生Roll号 - 提取目标记录:从挂科记录中筛选出这些学生的所有挂科条目
完整代码
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
相关产品推荐
相关产品推荐

