本系列文章可在公众号中找到:数据大宇宙 > 数据处理 > pd
在数据领域,Python的应用日益广泛,但许多初学者在深入学习后仍感数据处理过程繁琐。经过探索,我们发现Python之所以在数据处理方面表现出色,关键在于其强大的数据分析工具——pandas。
许多读者反映pandas专栏缺乏实践练习,为此,我特别选用了一套SQL题目作为pandas课程的补充练习。本文中的解题过程将尽可能采用pandas的基础操作,相关知识点在专栏的前15节中有详细讲解。
本文的案例数据涉及学生各科考试成绩,数据准备过程已在上一篇文中详细说明,此处不再赘述,直接进入练习环节。
上一篇相关内容:
寻找与”赵雷”同学至少有一门相同课程报读的学生信息:
解析:
第5行:首先从”赵雷”的课程记录中筛选出缺考科目(df_wd.query(tg_query)[cols]),由于记录只有一行(.iloc[0]),接着检查哪些科目存在缺考(.isna())第6行:采用与第5行相同的逻辑,但这次针对其他学生第8行:将前两步的结果进行对比(tg_cond == other_cond),得出每个学生与”赵雷”课程相同的数量(1表示相同,0表示不同),然后统计每个学生相同科目的数量(.sum(axis=1)),若数量大于等于1,则符合条件接下来,我们将详细对比SQL的实现方式:
SQL的逻辑相对直接,但不够简洁,因为其执行顺序是从内到外,不易一眼看出整体逻辑。下面将简述其执行流程第5、6行:从成绩表(sc)中提取”赵雷”的考试科目(cid),之所以使用sid,是因为成绩表中没有学生姓名信息第3、4行:再次从成绩表(sc)中筛选出与”赵雷”科目相同的成绩记录。值得注意的是,这一步的结果包含了”赵雷”自身,因为没有过滤掉”赵雷”的记录第1、2行:最终结果需要包含大部分学生信息,这些信息存在于学生表(student)中,因此从学生表中提取与上一步结果匹配的学生信息。需要强调的是,最终结果不包含学生成绩信息,因为学生表中没有这些数据整个SQL的关键在于in语句的使用使用CTE(公用表表达式)可以使SQL逻辑更加清晰,但不同数据库对CTE的支持程度存在差异如果需求变为至少有两门课程相同,那么上述SQL思路将不再适用,需要重新设计查询方案pandas也能按照类似的思路实现:
pandas中的isin功能与SQL的in语句相对应对于A列.isin(B列),将返回一个与A列等长的布尔值列,每个布尔值表示A列中的对应值是否存在于B列中寻找与”赵雷”同学完全相同课程报读的学生信息:
观察发现,这与之前的需求类似,只是判断相同课程数量的逻辑有所不同但如果我们尝试使用之前的SQL思路,在这个需求上将无法直接应用,具体的SQL解决方案请参考源代码。
未学习”张三”老师任一课程的学生姓名:
第4行:所有课程教师均不是”张三”(df_wd[cols]!=tc)的学生有两门及以上不及格课程的学生学号、姓名及平均成绩:
第3行:不及格科目(df_wd[cols]<60)的数量(.sum(axis=1))大于等于2门的学生(>=2)第5行:计算平均成绩(df_wd[cols].mean(axis=1))检索”语文”课程成绩低于60分,并按分数降序排列的学生信息:
第3行:语文成绩低于60分(df_wd[cols]<60)第5行:按分数降序排列(.sort_values(cols,ascending=False))按平均成绩从高到低展示所有学生的所有课程成绩及平均成绩: