在Pandas中,如何根据Group By 结果计算 Row Number

在Pandas中,如何根据Group By 结果计算 Row Number例如我们有下面的数据,第一列是用户的ID,第二列是用户的购买日期,现在如果我们需要判断用户是否重复购买,并且,每一次的购买,下一次的购买时间间隔是多少呢?

大家好,又见面了,我是你们的朋友全栈君。


有的同学在处理自己的业务逻辑的时候,需要用到Row Number的方法,那么,什么是Row Number呢?

例如我们有下面的数据,第一列是用户的ID,第二列是用户的购买日期,现在如果我们需要判断用户是否重复购买,并且,每一次的购买,下一次的购买时间间隔是多少呢?

id,date
1,20150601
1,20150603
2,20150601
2,20150605
2,20150610
3,20150503
3,20150603
4,20150601

如果我们可以处理称为下面的数据,那么这个问题就完美解决了:

   id    date_x      date_y
0   1  20150601  20150603.0
1   1  20150603         NaN
2   2  20150601  20150605.0
3   2  20150605  20150610.0
4   2  20150610         NaN
5   3  20150503  20150603.0
6   3  20150603         NaN
7   4  20150601         NaN

date_y就是下一次的购买时间,date_y-date_x就是前后两次的购买间隔。

下面我们来看代码:

import pandas;

data = pandas.read_csv(“C:\\data\\test.csv”)

#大家注意,一定要先排序
data = data.sort([‘id’, ‘date’], ascending=[1, 1])

#使用groupby方法,然后继续调用rank方法,即可获取到每一个数据在原始数据的排序。
rnColumn = data.groupby(‘id’).rank(method=’min’)
data[‘rn’] = rnColumn;

data
Out[24]: 
   id      date   rn
0   1  20150601  1.0
1   1  20150603  2.0
2   2  20150601  1.0
3   2  20150605  2.0
4   2  20150610  3.0
5   3  20150503  1.0
6   3  20150603  2.0
7   4  20150601  1.0

在这里,我们可以看到,所谓的row Number,就是指在指定的分组中,它相对于非分组列,也就是date的排序号。

因为,我们希望得到某行对下一行的连接,因此,下一行,减一,就可以和上一行对应上了。

data[‘rn_1’] = rnColumn-1

#how参数,设置保留所有左边的表的输入。
data.merge(data, how=’left’, left_on=[‘id’, ‘rn’], right_on=[‘id’, ‘rn_1’])

这样子,我们就可以得到以下的结果了,我们通过筛选列,就可以得到我们的目标数据了。

data.merge(data, how=’left’, left_on=[‘id’, ‘rn’], right_on=[‘id’, ‘rn_1’])
Out[21]: 
   id    date_x  rn_x  rn_1_x      date_y  rn_y  rn_1_y
0   1  20150601   1.0     0.0  20150603.0   2.0     1.0
1   1  20150603   2.0     1.0         NaN   NaN     NaN
2   2  20150601   1.0     0.0  20150605.0   2.0     1.0
3   2  20150605   2.0     1.0  20150610.0   3.0     2.0
4   2  20150610   3.0     2.0         NaN   NaN     NaN
5   3  20150503   1.0     0.0  20150603.0   2.0     1.0
6   3  20150603   2.0     1.0         NaN   NaN     NaN
7   4  20150601   1.0     0.0         NaN   NaN     NaN

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/136545.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • java.lang.NoSuchMethodException: <init>[通俗易懂]

    java.lang.NoSuchMethodException: <init>[通俗易懂]报错信息(捡重要的):java.lang.NoSuchMethodException:com.mmall.pojo.OrderItem.&lt;init&gt;(java.lang.Integer,java.lang.Integer,java.lang.Long,java.lang.Integer,java.lang.String,java.lang.String,java.m…

    2022年6月15日
    38
  • 最全Mac系统快捷键一览

    最全Mac系统快捷键一览Mac中主要有四个修饰键,分别是Command,Control,Option和Shift。这四个键分别有自己的图案,他们经常出现在Mac应用程序中的菜单栏里,方便你随时学习新的快捷键。MAC键盘快捷键符号图例通用Command是Mac里最重要的修饰键,在大多数情况下相当于Windows下的Ctrl。所以以下最基本操作很好理解:Command+Z 撤销Comma

    2022年5月25日
    26
  • js通过contentWindow控制iframe子页面元素点击事件,并把值传给父页面[通俗易懂]

    js通过contentWindow控制iframe子页面元素点击事件,并把值传给父页面[通俗易懂]本来需要点击一个图片后,显示一个iframe上传框.点击上传,从而操作子页面中的点击上传动作,再把值传给父页面.或控制父页面中iframe元素的显示状态.不过.通过upload()函数,可以不用显示上传框了,直接激活子页面中的上传动作.另外,onchange事件则可以自动提交上传,不必用户点击上传按钮了.三步并做一步&lt;!–父页面中的上传按钮–&gt;&lt;imgsrc="…

    2022年10月19日
    0
  • h3c路由器常用命令汇总_h3c命令手册

    h3c路由器常用命令汇总_h3c命令手册1、进入系统视图模式system-view2、为设备命名sysname3、显示当前配置displaycurrent-configuration4、中英文切换language-modeChinese|English5、进入以太网端口视图interfaceEthernet1/0/16、设置端口访问模式portlink-typeAccess|Trunk|Hybrid7、激活以太网端口undoshutdown8、关闭以太网端口shut

    2022年10月18日
    0
  • springboot上传文件(存入服务器,并将URL存入数据库表中)「建议收藏」

    springboot上传文件(存入服务器,并将URL存入数据库表中)「建议收藏」publicRupLoadAccessory(@RequestParam(“file”)MultipartFilefile){Map&amp;lt;String,Object&amp;gt;map=newHashMap&amp;lt;&amp;gt;();if(file.isEmpty()){map.put(&amp;quot;result&amp;quot;,&amp;quot;fail&

    2022年6月6日
    32
  • 深入理解Java的接口和抽象类

    深入理解Java的接口和抽象类

    2021年9月13日
    41

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号