如何使用Pandas实现MySQL窗口函数


今天小编给大家分享一下如何使用Pandas实现MySQL窗口函数的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。环境:
windows11 64位
Python3.9
MySQL8
pandas1.4.2本次使用的数据如下。
使用 Python 构建该数据集的语法如下:注:直接将代码放 jupyter 的 cell 跑即可。后文都直接使用df1df2df3调用对应的数据。使用 MySQL 构建该数据集的语法如下:注:直接将代码放 MySQL 代码运行框跑即可。后文跑 SQL 代码时,默认带上数据集(代码的1~18行),仅展示查询语句,如第19行。对应关系如下:row_number()是对检索的数据计算行号,从1开始递增。一般涉及分组字段和排序字段,每一个分组里的行号都唯一。
MySQL 的row_number()函数在 Python 中可以使用groupby()+rank()实现类似的效果。groupby()单列聚合时,直接将列名传递进去即可,如groupby('col2');如果是多列,则传一个列表,如groupby(['col2','col6'])rank()只能对一列进行排序,如df.col2.rank();当有多列排序的时候,可以使用sort_values(['col6','col5']先排好序,再聚合,然后使用累加函数cumcount()或排序函数rank()。另外,需要注意一点,排序字段如果有重复值,在 MySQL 中会随机返回,而 Python 中会默认使用index列进一步排序。
具体例子如下:1、单列分组,单列排序
当分组和排序都只有一列的时候,在 Python 中使用groupby()单列聚合加上rank()对单列进行排序即可。2、多列分组,单列排序
当有多列分组,则传一个列表给groupby()函数。3、单列分组,多列排序
如果是多列排序,相对复杂一些,如下【Python1】先用sort_values()排好序,然后再用groupby()聚合,然后使用rank()将排序序号加上;而【Python2】和【Python1】前2步相同,在最后一步使用了cumcount()实现编号。3、多列分组,多列排序
多列分组和多列排序,直接在【3、单列分组,多列排序】的基础上,将多个分组字段添加到groupby([])中的列表即可。不再赘述。lead()是从当前行向后取列值,也可以理解为将指定的列向上移动;而lag()则相反,是从当前行向前取列值,也可以理解为将指定的列向下移动。
配合排序,二者可以进行互换,即:正序的lead()==倒序的lag()倒序的lead()==正序的lag()在 Python 中,可以通过shift()函数实现列值的上下移动,当传入一个正数时,列值向下移动,当传入一个负数时,列值向上移动
注:关于单列/多列分组和单列/多列排序的情况,参考row_number(),不再赘述。1、移动1行
移动1行时,MySQL 中直接使用lead(col1)/lag(col1)即可,使用lead(col1,1)/lag(col1,1)也没问题,再结合升降序实现列值的上下移动。
在 Python 中,则使用shift(-1)shift(1)实现相同的效果。以下例子是将col1下移,所以使用shift(-1)2、移动多行
移动多行的时候,MySQL 中需要指定移动行数,如下例子,移动2行,使用lead(col1,2)lag(col1,2),再结合升降序实现列值的上下移动。
在 Python 中,则修改传递给shift()函数的参数值即可,如下例子,使用shift(2)向上移动2行。rank()dense_rank()用于计算排名。rank()排名可能不连续,就是当有重复值的时候,会并列使用小的排名,而重复值之后的排名则按照重复个数叠加往后排,如一组数(10,20,20,30),按升序排列是(1,2,2,4);而dense_rank()的排名是连续的,还是上面的例子,按升序排列是(1,2,2,3)。
而在 Python 中,排序同样是通过rank()函数实现,只是methodrow_number()使用的不一样。实现rank()的效果,使method='min',而实现dense_rank()的效果,使用method='dense'。除了这两种和在row_number()中使用的method='first',还有averagemaxaverage的逻辑是所有值进行不重复连续排序之后,将分组内的重复值的排名进行平均,还是上面的例子,按升序排列是(1,2.5,2.5,4),maxmin相反,使用的是分组内重复值取大的排名进行排序,还是上面的例子,按升序排列是(1,3,3,4)。
同样地,排序字段如果有重复值,在 MySQL 中会随机返回,而 Python 中会默认使用index列进一步排序。注:关于单列/多列分组和单列/多列排序的情况,参考row_number(),不再赘述。
1、rank()
Python 中使用rank(method='min')实现 MySQL 中的rank()窗口函数。2、dense_rank()
Python 中使用rank(method='dense')实现 MySQL 中的rank()窗口函数。MySQL 中的窗口函数first_value()是取第一个值,可用于取数据默认顺序的第一个值,也可以通过排序,取某一列的最大值或最小值。
在 Pandas 中,也有相同功能的函数first()
不过,first_value()是窗口函数,不会影响表单内的其他字段,但first()时一个普通函数,只返回表单中的第一个值对应的行,所以在 Python 中要实现first_value()窗口函数相同的结果,需要将first()函数返回的结果,再通过表联结关联回原表(具体例子如下)。在 Python 中,还有一个last()函数,和first()相反,结合排序,也可以实现相同效果,和first()可互换,读者可自行测试,不再赘述。注:关于单列/多列分组和单列/多列排序的情况,参考row_number(),不再赘述。
1、取最大值
MySQL 中,对col5降序,便可通过first_value()取得最大值。同样,在 Python 中,使用sort_values()col5进行降序,便可通过first()取得最大值,然后再merge()回原表。2、取最小值
取最小值,则是在取最大值的基础上,改变col5的排序即可,由降序改为升序。MySQL 的聚合函数count()sum()等,也可以加上over()实现窗口函数的效果。count()可以用于求各个分组内的个数,也可以对分组内某个列的值进行累计。sum()可以用于对各个分组内某个列的值求和,也可以对分组某个列的值进行累加。在 Python 中,免费云主机域名针对累计和累加的功能,可以使用groupby()+cumcount()groupby()+cumsum()实现(如下例子1和2),而针对分组内的计数和求和,可以通过groupby()+count()groupby()+sum()实现(如下例子3和4)。注:关于单列/多列分组和单列/多列排序的情况,参考row_number(),不再赘述。
1、升序累计
Python 中使用sort_values()+groupby()+cumcount()实现 MySQL count()over(partition by order by )效果。2、升序累加
Python 中使用sort_values()+groupby()+cumsum()实现 MySQL sum()over(partition by order by )效果。3、分组计数
Python 中使用sort_values()+groupby()+count()实现 MySQL count()over(partition by )效果。4、分组求和
Python 中使用sort_values()+groupby()+sum()实现 MySQL sum()over(partition by )效果。MySQL 的窗口函数效果,在 Python 中,基本都需要经过多个步骤,使用多个函数进行组合处理。窗口函数涉及到分组字段和排序字段,在 Python 中对应使用groupby()sort_values(),所以基本上在 Python 中实现窗口函数的效果都需要使用到这两个函数辅助处理数据。剩下的聚合形式就根据聚合窗口函数的特性做修改,对应关系如下:以上就是“如何使用Pandas实现MySQL窗口函数”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注百云主机行业资讯频道。

相关推荐: SpringBoot项目中怎么保存控制台日志

这篇文章主要介绍“SpringBoot项目中怎么保存控制台日志”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“SpringBoot项目中怎么保存控制台日志”文章能帮助大家解决问题。情景:SpringBoot项目中需要把控…

免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。

(0)
打赏 微信扫一扫 微信扫一扫
上一篇 05/11 16:20
下一篇 05/11 16:20

相关推荐