前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >sql题目pandas解法(01):筛选、all、any常用技巧

sql题目pandas解法(01):筛选、all、any常用技巧

作者头像
咋咋
发布2021-09-01 14:50:08
1.3K0
发布2021-09-01 14:50:08
举报
文章被收录于专栏:数据大宇宙数据大宇宙

经常听别人说 Python 在数据领域有多厉害,结果学了很长时间,连数据处理都麻烦得要死。后来才发现,原来不是 Python 数据处理厉害,而是他有数据分析神器—— pandas

前言

有不少小伙伴向我反映 pandas 专栏缺少练习题,因此这里我使用一套 sql 的题目,作为 pandas 专栏的课后练习题。本文大部分的解题过程尽可能使用 pandas 中最基础的入门操作完成,涉及的知识点基本在专栏中的前15节内容中有详尽讲解。

sql 题目不就是表连接+子查询?但是今天我不使用 sql 的思路解题,你会发现原来这种思路下解题会简单很多!


案例数据

这是一个关于学生科目考试成绩作为背景的数据,主要有以下4个概念,分别对应一个数据表:

  1. 学生信息(student)
  2. 课程信息(course)
  3. 教师信息(teacher)
  4. 考试成绩(sc)

假设数据完全按照关系型数据库的方式保存,我们当然可以使用 sql 的思维,使用 pandas 完成一系列需求,但是本文将教你一种更直观的解决方式。

本文不会提及 Sql 的解决方法,但是每个题目在源码中都保留了 Sql 语句


把多个表整理成一个表

首先,我使用 pandas 专栏第37节中的通用方法,按照前面的数据关系图,设置 setting.xlsx 文件即可:

可能你会看不懂,如下是与数据关系图的对比:


导入包如下:

  • 行3:导入通用模块(这是我们自定义的,可以在不同项目中快速使用)

加载数据,并根据 setting 表把多个表关联起来:

  • 行3:使用 helper.auto_merge ,根据 setting 表的配置,自动把多个表给连接起来
  • 最终结果是一个总成绩表,每行表示某学生(SId、Sname)某科目(CId、Cname)的考试成绩(score)

本文不使用 Sql 的思路进行解题,我们把表转成一行表示一个学生的"宽表":

  • 行1,2:把表做一下透视,把 学生编号(SId)作为行索引,科目(Cname)作为表头,值区域为分数(score)与教师名字(Tname)。注意,在透视之前,先过滤掉没有考试科目的记录(df[df.CId.notna()])
  • 行3:用 学生表 与 上一步的结果合并一下
  • 现在,df_wd 就是我们要的表,一行表示一个学生

接下来,我们将使用 df_wd 进行大部分的解题。

有些人会非常反对直接使用这种"宽表"进行统计处理,这是因为如果科目有增减(比如新增一个科目),会导致你的代码不能适应。但是,实际上在 pandas 中非常容易即可解决这些问题。


查询语文比数学成绩高的学生的信息及课程分数

直接看如下示意图:

  • 不管如何,构造一列 bool 值,是所有 pandas 筛选数据的重点

查询同时存在语文和数学成绩的情况

示意图:

  • 对一个表做 notna(),得到整个表的 bool 值
  • 通过 all 或 any 得到一列 bool,其中的参数 axis 非常重要,axis=1,每一行得到一个bool值
  • all 表示一堆的 bool 中是否全是 True
  • any 表示一堆的 bool 中,是否至少有一个是 True

理解这些基本原理,其实后面的大部分需求都是这些套路而已!


没有语文成绩但存在数学成绩的学生

  • 行3:没有成绩,用 isna 表示,有成绩,用 notna 表示

查询平均成绩大于等于 60 分的同学的学生编号和学生姓名和平均成绩

  • 行3:对3列 分数列(score) 求平均,注意 axis 参数
  • 行4:这是 pandas 另一种筛选方式

查询存在成绩的学生信息

  • 行2:3列成绩列,任意(any)有一个存在成绩(notna)

所有同学的学生编号、学生姓名、选课总数、所有课程的成绩总和

  • 行2:3科有成绩(notna),由于 True=1,False=0,因此,求和(sum)就相当于有成绩的科目数
  • 行3:3科成绩求和(sum)
  • 行5:任意(any)一科有成绩(notna)的筛选出来

查询「李」姓老师的数量

  • 行1:str.方法,是文本列的特别处理方法
  • 行2:通过 len(表) 可以得到表的行数

学过「张三」老师授课的同学的信息

  • 行3:直接判断3个教师列是否为"张三",把任意一个有张三科目的学生筛选出来

查询没有学全所有课程的同学的信息

  • 行3:任何(any)缺失成绩(isna)的科目

总结

本文讲到这里(9题),全是一个套路。下一节是其他角度的题目,敬请关注!

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-03-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 数据大宇宙 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 案例数据
  • 把多个表整理成一个表
  • 查询语文比数学成绩高的学生的信息及课程分数
  • 查询同时存在语文和数学成绩的情况
  • 没有语文成绩但存在数学成绩的学生
  • 查询平均成绩大于等于 60 分的同学的学生编号和学生姓名和平均成绩
  • 查询存在成绩的学生信息
  • 所有同学的学生编号、学生姓名、选课总数、所有课程的成绩总和
  • 查询「李」姓老师的数量
  • 学过「张三」老师授课的同学的信息
  • 查询没有学全所有课程的同学的信息
  • 总结
相关产品与服务
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档