如何在Pandas中结合groupby与filter统计仅通过1门考试的学生数
统计仅通过1门考试的学生数量解决方案
需求说明
从学生成绩表中统计仅通过1门考试的学生数量(通过标准:得分≥40分),同时输出每个学生的通过考试门数。
示例数据
student exam score 123 Math 42 123 IT 39 321 Math 12 321 IT 11 333 IT 66 333 Math 77
实现步骤(Pandas)
- 标记每门考试是否通过
- 按学生分组统计通过门数
- 筛选并统计仅通过1门的学生数量
- 输出结果详情
完整代码
import pandas as pd # 构造示例数据 data = { 'student': [123, 123, 321, 321, 333, 333], 'exam': ['Math', 'IT', 'Math', 'IT', 'IT', 'Math'], 'score': [42, 39, 12, 11, 66, 77] } df = pd.DataFrame(data) # 标记每门考试是否通过(≥40分为通过) df['passed'] = df['score'] >= 40 # 按学生分组,统计每个学生的通过考试门数 student_pass_counts = df.groupby('student')['passed'].sum().astype(int) # 统计仅通过1门考试的学生数量 target_student_count = (student_pass_counts == 1).sum() # 输出结果 print(f"count of students = {target_student_count} #ans") for student_id, pass_num in student_pass_counts.items(): if pass_num == 0: print(f"student {student_id} 0 exams passed") else: print(f"student {student_id} has {pass_num} succeeded passed exams")
代码说明
- 标记通过状态:新增
passed布尔列,用score >=40直接判断,求和时True会被识别为1、False为0,方便统计数量。 - 分组统计:
groupby('student')['passed'].sum()按学生聚合,快速得到每个学生的通过门数。 - 筛选目标学生:通过
student_pass_counts ==1生成布尔序列,求和后得到仅通过1门的学生总数。
运行结果
count of students = 1 #ans student 123 has 1 succeeded passed exams student 321 0 exams passed student 333 has 2 succeeded passed exams
内容的提问来源于stack exchange,提问作者Ace Pro
相关产品推荐
相关产品推荐

