Python和MySQL对比(1):用Pandas 实现MySQL语法效果

news2024/11/17 13:47:32

文章目录

  • 一、前言
  • 二、语法对比
    • 数据表
    • SELECT
    • AS
    • WHERE
    • DISTINCT
    • GROUP BY
    • ORDER BY
    • HAVING
    • LIMIT
  • 三、小结

一、前言

环境:
windows11 64位
Python3.9
MySQL8
pandas1.4.2

本文主要介绍 MySQL 中的关键字:SELECT、AS、WHERE、DISTINCT、GROUP BY、ORDER BY、HAVING、LIMIT等的查询语句,如何使用pandas实现,同时二者又有什么区别。

注:Python是很灵活的语言,达成同一个目标或有多种途径,我提供的只是其中一种解决方法,大家有其他的方法也欢迎留言讨论。

二、语法对比

数据表

本次使用的数据结构如下:
image.png
共6列6行,col3col4各有一个null值。
使用 Python 构建该数据集的语法如下:

import pandas as pd
import numpy as np

df1 = pd.DataFrame({ 'col1' : list(range(1,7))
                    ,'col2' : ['AA','AA','AA','BB','BB','BB']#list('AABCA')
                    ,'col3' : ['X',np.nan,'Da','Xi','Xa','xa']
                    ,'col4' : [10,5,3,5,2,None]
                    ,'col5' : [90,60,60,80,50,50]
                    ,'col6' : ['Abc','Abc','bbb','Cac','Abc','bbb']
                   })
df1

注:直接将代码放 jupyter 的 cell 跑即可。后文都直接使用df1调用 Python 的数据

使用 MySQL 构建该数据集的语法如下:

with t1 as(
  select  1 as col1, 'AA' as col2, 'X' as col3, 10.0 as col4, 90 as col5, 'Abc' as col6 union all
  select  2 as col1, 'AA' as col2, null as col3, 5.0 as col4, 60 as col5, 'Abc' as col6 union all
  select  3 as col1, 'AA' as col2, 'Da' as col3, 3.0 as col4, 60 as col5, 'bbb' as col6 union all
  select  4 as col1, 'BB' as col2, 'Xi' as col3, 5.0 as col4, 80 as col5, 'Cac' as col6 union all
  select  5 as col1, 'BB' as col2, 'Xa' as col3, 2.0 as col4, 50 as col5, 'Abc' as col6 union all
  select  6 as col1, 'BB' as col2, 'xa' as col3, null as col4, 50 as col5, 'bbb' as col6 
)
select * from t1;

注:直接将代码放 MySQL 代码运行框跑即可。后文跑 SQL 代码时,默认带上数据集(代码的1~8行),仅展示查询语句,如第9行。

SELECT

检索数据,一般分三种情况,检索所有列的数据、检索单个列的数据和检索多个列的数据,下面分这三种情况来看看二者的呈现结果。
1、检索所有列

语言PythonMySQL
代码df1select * from t1;
结果image.pngimage.png

2、检索单个列
注意df1[['col2']]返回的是一个 DataFrame 类型,而其他两个是 Series。从 Series 转化为 DataFrame 也可以使用 to_frame()方法,比如:df1.col2.to_frame(),如果需要修改转化后的列名,可以直接把新的名字以字符串形式传递给to_frame(),如df1.col2.to_frame('new_name')

语言PythonMySQL
代码df1.col2 或 df1[‘col2’]或df1[[‘col2’]]select col2 from t1;
结果image.png
image.png
image.png

3、检索多个列
当检索更多列时,直接在 Python 代码的col3后新增列名即可。

语言PythonMySQL
代码df1[[‘col2’, ‘col3’]]或df1.loc[:,[‘col2’, ‘col3’]]select col2,col3 from t1;
结果image.pngimage.png

AS

命别名,这也是一个比较常用的语法。名别名主要有两种形式,一个是对字段名取别名,一个是对表名取别名。字段名一般会有两种情况:一是原有字段重命名,一是新生成的字段重命名。

1、字段名-原有字段重命名
对已知的字段命别名,Python 中使用rename()方法,给columns参数传递一个字典,把需要重新命名的字段全部以键值对的形式放到字典中。

语言PythonMySQL
代码df1[[‘col1’, ‘col2’]].rename(columns={‘col1’:‘index’,‘col2’:‘name’})select col1 as index,col2 as name from t1;
结果image.pngimage.png

2、字段名-生成字段重命名
在 MySQL 中,一气呵成。但是在 Python 需要先显式新增一列,然后再查询出对应的数据。

语言PythonMySQL
代码df1[‘col7’]=df1.col5*df1.col4
df1[[‘col2’,‘col7’]]
select col2,col5*col4 as col7 from t1;
结果image.pngimage.png

3、表名名别名
表是否名别人,从数据上看不出来,此处省略结果。
Python 给表命别名,其实就是再新增一个变量,把数据赋值给它。新旧变量本质不是同一个,但数据内容一致,在处理数据层面没有太大差异。

语言PythonMySQL
代码t2 = df1[:]
t2
select * from t1 as t2;
结果--

WHERE

WHERE 的内容相对比较多一些,分单条件、多条件,也分检索单列、多列、所有列,单列比较简单,可以从多列窥探一二,故省略。

1、单条件,所有列

语言PythonMySQL
代码df1[df1.col2==“AA”]select * from t1 where col2 = ‘AA’;
结果image.pngimage.png

2、多条件,所有列
注意:多个条件时,每个条件加括号,然后用符号链接,and 为 &,or 为 |

语言PythonMySQL
代码df1[(df1[‘col2’]==‘AA’) & (df1[‘col4’]==5)]select * from t1 where col2 = ‘AA’ and col4 = 5;
结果image.pngimage.png

3、单条件,多列
该例子中,两种 Python 的实现方式都可以。第一种df1[df1.col2=='AA'][['col1','col2']]先where,再select;第二种df1[['col1','col2']][df1.col2=='AA']先select,再where。虽然顺序不一样,但是殊途同归。

语言PythonMySQL
代码df1[df1.col2==‘AA’][[‘col1’,‘col2’]]或
df1[[‘col1’,‘col2’]][df1.col2==‘AA’]
select col1,col2 from t1 where col2 = ‘AA’;
结果image.pngimage.pngimage.png

4、多条件,多列
Python 的两种实现方法和3、单条件,多列类似。

语言PythonMySQL
代码df1[(df1[‘col2’]==‘AA’) & (df1[‘col4’]5)][[‘col1’, ‘col2’]]或
df1[[‘col1’, ‘col2’]][(df1[‘col2’]
‘AA’) & (df1[‘col4’]==5)]
select col1, col2 from t1 where col2=‘AA’ and col4=5;
结果image.pngimage.pngimage.png

5、带有null值的条件
除了前面3或4介绍的两种方法,还可以使用loc方法,具体如下例子。

语言PythonMySQL
代码df1[df1[‘col3’].isnull()][[‘col1’,‘col3’]]或
df1[[‘col1’,‘col3’]][df1[‘col3’].isnull()]或
df1.loc[df1[‘col3’].isnull(), [‘col1’,‘col3’]]或
df1[[‘col1’,‘col3’]][df1[‘col3’].isnull()]
select col1,col3 from t1 where col3 is null;
结果image.pngimage.pngimage.png

DISTINCT

去重主要分单列去重和多列去重。

1、单列去重
Python 中,取唯一值可以使用unique()方法,不过该方法仅作用于 Series,而且返回的是数组,如果要使得结果是 Series,需要进行显式转化。

语言PythonMySQL
代码pd.Series(df1.col2.unique())select distinct col2 from t1;
结果image.pngimage.png

2、多列去重
Python 中,unique()仅作用于 Series,当涉及多列去重时,使用的是 DataFrame,这时unique()便不再适用。
通过drop_duplicates()方法可以实现多列去重。
df1[['col2','col5']].drop_duplicates()不指定去重列,默认全部列一起去重;而向drop_duplicates()传递一个列表参数,可以对指定的列进行去重,如:df1[['col2','col5']].drop_duplicates(["col2","col5"])

语言PythonMySQL
代码df1[[‘col2’,‘col5’]].drop_duplicates() 或
df1[[‘col2’,‘col5’]].drop_duplicates([“col2”,“col5”])
select distinct col2,col5 from t1;
结果image.pngimage.pngimage.png

GROUP BY

聚合主要有3种情况:没有GROUP BY,直接聚合、指定单列聚合、指定多列聚合。

1、直接聚合-计数
直接统计行数,在 Python 的DataFrame 类型中,可以直接通过shape获取到。

语言PythonMySQL
代码df1.shape[0]select count(*) from t1;
结果image.pngimage.png

2、直接聚合-去重计数
去重计数,需要对重复列先去重,保留唯一值,然后再计数。这里使用到duplicated()方法,它可以判断指定的列是否重复,然后返回一个掩码。由于返回的掩码是判断是否重复,实际应用,我们需要的是没有重复,所以需要反向取值,加一个~

语言PythonMySQL
代码df1[~df1.duplicated(‘col2’)].shape[0]或
df1[~df1.col2.duplicated()].shape[0]
select count(distinct col2) from t1;
结果image.pngimage.pngimage.png

3、直接聚合-多个聚合字段
在 Python 中,多个聚合字段需要使用到agg()方法。

语言PythonMySQL
代码df1.agg({‘col5’: [‘min’, ‘max’, ‘mean’,‘sum’]}).Tselect max(col5), min(col5), avg(col5),sum(col5) from t1;
结果image.pngimage.png

4、指定一列聚合
Python 可通过groupby指定聚合列进行聚合操作。

语言PythonMySQL
代码df1.groupby([‘col2’])[‘col5’].sum().reset_index()select col2, sum(col5) from t1 group by col2;
结果image.pngimage.png

5、指定多列聚合
Python 在使用groupby进行聚合的时候,需要注意保证被指定的列都无null值,以便最终聚合结果正确。
保险起见,每次建议都加一步填充,再进行聚合。

  • size()语法是对数据进行计数。
  • reset_index()则是重置所以。

注意:在本例中,返回的结果是有差异的,MySQL 把col3Xaxa视为一类,而 Python 中则视为不同的两类。所以返回结果有出入。

语言PythonMySQL
代码df1.fillna(999).groupby([‘col2’, ‘col3’]).size().reset_index()select col2,col3,count(*) from t1 group by col2,col3;
结果image.pngimage.png

ORDER BY

1、单列升序
从执行结果看,我们可以发现,在升序排序前提下,Python 中 NaN 值是排在最后,而且先排大写,再排小写;而 MySQL 的 NULL 值排在第一位,大小写视为一类。

语言PythonMySQL
代码df1.col3.sort_values()select col3 from t1 order by col3;
结果image.pngimage.png

2、单列降序
MySQL 的降序,直接在字段后加上DESC即可,而 Python 则需要通过 ascending参数。

语言PythonMySQL
代码df1[[‘col2’,‘col3’]].sort_values(by=[‘col3’],ascending=False)
select col2,col3 from t1 order by col3 desc;
结果image.pngimage.png

3、多列混序

语言PythonMySQL
代码df1[[‘col2’,‘col3’]].sort_values([‘col2’,‘col3’],ascending=[True,False])select col2,col3 from t1 order by col2,col3 DESC;
结果image.pngimage.png

HAVING

该案例比较复杂,具体含义是取col5大于等于60的值,按col2聚合,并筛选出聚合个数超过1的行,同时对聚合个数进行降序排序,最终返回col2列和聚合的个数。
Python 的实现先提取所有的符合having的数据,然后再一步groupby聚合。

语言PythonMySQL
代码df1[df1.col5>=60].groupby(‘col2’).filter(lambda x:len(x)>1).groupby(‘col2’).size().sort_values(ascending=False)
select col2, count() from t1 where col5 >=60 group by col2 having count() > 1 order by count(*) desc;
结果image.pngimage.png

LIMIT


MySQL 的 limit 相当于 Python 的head()或切片。

语言PythonMySQL
代码df1.head(2)或
df1[0:2]
select * from t1 limit 2;
结果image.png
image.png
image.png

结合ORDER BY进行定向取值的时候,在 Python 中可以使用nlargest()方法或nsmallest()方法辅助取值。nlargest()方法是从大到小的降序逻辑,nsmallest()方法则反过来。

语言PythonMySQL
代码df1.nlargest(3, columns=‘col5’)[[‘col2’,‘col5’]]select col2,col5 from t1 order by col5 desc limit 3;
结果image.pngimage.png

补充一点,由于数据量小,所以LIMIT返回的数据看不出什么差异,实际上,当表单数据较大时,MySQL 的查询会随机返回数据,而 Python 不会。

三、小结

作为一门开发语言,Python 的灵活性是很强的,基本上MySQL的语法都可以在 Python 中实现。当然,局部也有一些内容会有一些出入,比如在ORDER BY语法中就有排序上的差异,但是不影响大方向的使用。关于排序这点也可以通过自定义排序设置不区分大小写以及 null 值的顺序,不过似乎没有这个必要,即使同为SQL的其他语言,也和MySQL有一定的差异,比如 PgSQL 的 null 值排序和 MySQL 就是反着来的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/113379.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

文献检索

文献检索第一篇检索作业总结第一章检索任务1.1检索课题1.2确定选题所属学科1.3中英文检索词第二章检索策略与结果2.1检索中文期刊文献2.1.1 CNKI中国期刊全文数据库2.1.2 维普期刊全文数据库2.1.3 万方期刊数据库2.1.4 超星期刊全文2.2检索中文学位论文2.2.1 CNKI博硕学位论文数…

Java项目:SpringBoot美容院后台管理系统

作者主页:源码空间站2022 简介:Java领域优质创作者、Java项目、学习资料、技术互助 文末获取源码 项目介绍 本项目为美容院后台管理系统, 操作员包含以下功能:操作员登陆,操作员首页,会员列表,添加会员,添加美容产品,购买商品,添…

YOLOV7学习记录之mAP计算

如何评估一个训练好模型的好坏,是目标检测中一个很重要的因素,如常见的TP、FP、AP、PR、map等 TP、FP、TN、FN TP:被正确分类为正样本的数量;实际是正样本,也被模型分类为正样本 FP:被错误分类为正样本的…

Node.js - 数据库与身份认证

文章目录目标一、数据库的基本概念1、什么是数据库2、常见的数据库及分类3、传统型数据库的数据组织结构(1)Excel 的数据组织结构(2)传统型数据库的数据组织结构(3)实际开发中库、表、行、字段的关系二、安…

RV1126笔记十二:实现RTMP多路拉流

若该文为原创文章,转载请注明原文出处。 一、介绍 通过RV1126实现RTMP的多路拉流,并在屏幕上显示出来,这里涉及到ffmpeg几个重要知识点,和RV1126如何在屏幕分屏显示。 二、流程图 流程和单路拉流类似,这里只是涉及拉取后的图像需要解码缩放,在合成分屏显示出来。 具…

阳过→阳康,数据里的时代侧影;谷歌慌了!看各公司如何应对ChatGPT;两份优质AI年报;本周技术高光时刻 | ShowMeAI每周通讯 #003-12.24

这是ShowMeAI每周通讯的第3期。通讯聚焦AI领域本周热点,及其在各圈层泛起的涟漪;关注AI技术进步,并提供我们的商业洞察。欢迎关注与订阅! 本周在 CSDN 积极答题一路升到 Top2,被系统误判为 ChatGPT 机器人X﹏X 可见压力…

自动化测试-Cypress快速入门

cypress介绍 一个前端自动化测试工具不同于其他只能测试 UI 层的前端测试工具,Cypress 允许编写所有类型的测试,覆盖了测试金字塔模型的所有测试类型**【界面测试,集成测试,单元测试】**Cypress 测试代码和应用程序均运行在由 Cy…

拦截器与过滤器

什么是过滤器 过滤器 Filter 基于 Servlet 实现,过滤器的主要应用场景是对字符编码、跨域等问题进行过滤。Servlet 的工作原理是拦截配置好的客户端请求,然后对 Request 和 Response 进行处理。Filter 过滤器随着 web 应用的启动而启动,只初…

电商订单对接系列-第1章-整体设计

背景 电商行业在处理订单的业务时,初创一般是直接通过电商后台导出表格,然后根据其来跟进进销存。在单量到了一定规模时,业务场景会变得复杂,如促销套餐,拆单,合单等,一般会购买市面上的…

Android -- 每日一问:介绍一下你经常浏览的 Android 技术网站

经典回答 做为一个合格的 Android 开发者,我想官方的 developer 站点是必上的,有什么网站能比官方更全面和权威呢。而且 Android Developer 站点上还有很多指导性的文章写得很不错,也不用担心英文不好,因为基本上官方都翻译了中文…

一文轻松图解搞懂Elasticsearch原理!

ES 的集群模式和 kafka 很像,kafka 又和 redis 的集群模式很像。总之就是相互借鉴! 不管你用没用过 ES,今天我们一起聊聊它。就当扩展大家的知识广度了! 认识倒排索引 「正排索引 VS 倒排索引:」 正排索引 VS 倒排索…

【PyTorch深度学习项目实战100例】—— 基于FastText实现情感二分类任务 | 第78例

前言 大家好,我是阿光。 本专栏整理了《PyTorch深度学习项目实战100例》,内包含了各种不同的深度学习项目,包含项目原理以及源码,每一个项目实例都附带有完整的代码+数据集。 正在更新中~ ✨ 🚨 我的项目环境: 平台:Windows10语言环境:python3.7编译器:PyCharmPy…

【Pandas入门教程】如何重塑表格布局

如何重塑表格布局 来源:Pandas官网:https://pandas.pydata.org/docs/getting_started/intro_tutorials/index.html 笔记托管:https://gitee.com/DingJiaxiong/machine-learning-study 文章目录如何重塑表格布局导包数据准备【1】对表行进行排…

3.11.1、虚拟局域网 VLAN 概述

以太网交换机工作在数据链路层(也包括物理层) 使用一个或多个以太网交换机互连起来的交换式以太网,其所有站点都属于同一个广播域。 随着交换式以太网规模的扩大,广播域相应扩大。 巨大的广播域会带来很多弊端: 广播风暴难以管理和维护潜在…

LVGL学习笔记2 - 对象

目录 1. 创建对象 2. 设置大小 3. 设置位置 4. 设置对齐方式 5. 对象的父子关系 6. 其他 前面的例子中,一个矩形创建都是用到obj的函数,obj即是指对象。LVGL的基本要素是对象,实现了屏幕上组件的基本属性,包括大小、坐标、父…

SQLite数据库-学生管理系统(2.0)

SQLite数据库-学生管理系统 1.要求 布局文件 --------View层Activity文件---------Controller层Helper文件:建立数据库和表,版本更新Dao层:对数据库表中数据增删改查操作Entity:数据库在项目中的类,主要用于定义与数据…

短视频创业:大部分人都误解了豆荚的作用,掌握正确方法你就悟了

短视频,豆荚是避不过的功能,那么豆荚的作用和要不要投豆荚呢? 对于一般人来说,可能会觉得那投豆荚就是向买粉丝、买播放量、买数据的这么一个付费工具 对于一个专业的短视频运营来说,它其实是一个撬动自然流量的工具…

GROMACS模拟分析-自由能形貌图的绘制

自由能形貌(free energy landscape,FEL)表征了模拟过程中蛋白质的自由能变化。自由能形貌图一般通过两个描述体系特征的量来进行绘制,例如RMSD和Rg,也有文献中用主成分分析PC1和PC2绘制。本文以RMSD和Rg两个特征量绘制…

C++ 实现字符串查找 KMP算法

前言 众所周知,字符串查找的应用范围非常广,网页上有各式各样的浏览器搜索,再到编程需要的vsCode或vsStudio都自带了搜索功能;一个查找算法的优劣可以直接影响用户的搜索体验如何但鉴于暴力搜索算法的O(m * n)复杂度,…

精选测试面试题

一、Web自动化测试 1.Selenium中hidden或者是display = none的元素是否可以定位到? 不能,可以写JavaScript将标签中的hidden先改为0,再定位元素 2.Selenium中如何保证操作元素的成功率?也就是说如何保证我点击的元素一定是可以…