Python和MySQL对比(5):用Pandas实现MySQL窗口函数的效果

   日期:2024-12-29     作者:ira0v      
核心提示:环境: windows11 64位 Python3.9 MySQL8 pandas1.4.2本文主要介绍 MySQL 中的窗口函数、、、、、如何使用pandas实现ÿ

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

本文主要介绍 MySQL 中的窗口函数、、、、、如何使用pandas实现,同时二者又有什么区别。

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

本次使用的数据如下。

Python和MySQL对比(5):用Pandas实现MySQL窗口函数的效果

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

 

:直接将代码放 jupyter 的 cell 跑即可。后文都直接使用、、调用对应的数据。

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

 

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

对应关系如下

Python 数据集MySQL 数据集df1t1df2t2df3t3

是对检索的数据计算行号,从1开始递增。一般涉及分组字段和排序字段,每一个分组里的行号都唯一。
MySQL 的函数在 Python 中可以使用实现类似的效果。

  • 单列聚合时,直接将列名传递进去即可,如;如果是多列,则传一个列表,如。
  • 只能对一列进行排序,如;当有多列排序的时候,可以使用先排好序,再聚合,然后使用累加函数或排序函数。

另外,需要注意一点,排序字段如果有重复值,在 MySQL 中会随机返回,而 Python 中会默认使用列进一步排序。
具体例子如下

是从当前行向后取列值,也可以理解为将指定的列向上移动;而则相反,是从当前行向前取列值,也可以理解为将指定的列向下移动。
配合排序,二者可以进行互换,即

  • 正序的==倒序的
  • 倒序的==正序的

在 Python 中,可以通过函数实现列值的上下移动,当传入一个正数,列值向下移动,当传入一个负数,列值向上移动
:关于单列/多列分组和单列/多列排序的情况,参考,不再赘述。

和用于计算排名。排名可能不连续,就是当有重复值的时候,会并列使用小的排名,而重复值之后的排名则按照重复个数叠加往后排,如一组数(10,20,20,30,按升序排列是(1,2,2,4;而的排名是连续的,还是上面的例子,按升序排列是(1,2,2,3)。
而在 Python 中,排序同样是通过函数实现,只是和使用的不一样。实现的效果,使,而实现的效果,使用。除了这两种和在中使用的,还有和。的逻辑是所有值进行不重复连续排序之后,将分组内的重复值的排名进行平均,还是上面的例子,按升序排列是(1,2.5,2.5,4,和相反,使用的是分组内重复值取大的排名进行排序,还是上面的例子,按升序排列是(1,3,3,4)。
同样地,排序字段如果有重复值,在 MySQL 中会随机返回,而 Python 中会默认使用列进一步排序。

MySQL 中的窗口函数是取第一个值,可用于取数据默认顺序的第一个值,也可以通过排序,取某一列的最大值或最小值。
在 Pandas 中,也有相同功能的函数。
不过,是窗口函数,不会影响表单内的其他字段,但时一个普通函数,只返回表单中的第一个值对应的行,所以在 Python 中要实现窗口函数相同的结果,需要将函数返回的结果,再通过表联结关联回原表(具体例子如下)。在 Python 中,还有一个函数,和相反,结合排序,也可以实现相同效果,和可互换,读者可自行测试,不再赘述。

MySQL 的聚合函数和等,也可以加上实现窗口函数的效果。

  • 可以用于求各个分组内的个数,也可以对分组内某个列的值进行累计。
  • 可以用于对各个分组内某个列的值求和,也可以对分组某个列的值进行累加。

在 Python 中,针对累计和累加的功能,可以使用和实现(如下例子1和2,而针对分组内的计数和求和,可以通过和实现(如下例子3和4)。

     本文地址:http://w.yusign.com/tjnews/3644.html    述古往 http://w.yusign.com/static/ , 查看更多
 
标签: 使用 排序
特别提示:本信息由相关用户自行提供,真实性未证实,仅供参考。请谨慎采用,风险自负。

举报收藏 0打赏 0
 
更多>同类生活信息

相关文章
最新文章
推荐文章
推荐图文
生活信息
点击排行
{
网站首页  |  关于我们  |  联系方式  |  用户协议  |  隐私政策  |  版权声明  |  网站地图  |  排名推广  |  广告服务  |  积分换礼  |  网站留言  |  RSS订阅  |  违规举报  |  鄂ICP备2020018471号