
Pandas基础|用户游览日志时间合并排序
发布日期:2021-05-10 12:02:27
浏览次数:14
分类:精选文章
本文共 1736 字,大约阅读时间需要 5 分钟。
作者:小小明,Pandas数据处理专家,致力于帮助无数数据从业者解决数据处理难题。
需求说明
有一份下面格式用户游览日志的数据(复制下面显示的表格后,运行下面的代码才会出现相同的结果):
import pandas as pddf = pd.read_clipboard()df
结果:
uid | start | end | |
---|---|---|---|
0 | A | 1 | 2 |
1 | A | 4 | 7 |
2 | A | 3 | 6 |
3 | A | 8 | 9 |
4 | B | 2 | 3 |
5 | B | 4 | 7 |
6 | B | 10 | 11 |
7 | B | 6 | 8 |
8 | B | 12 | 15 |
9 | C | 14 | 15 |
其中uid表示每个用户,start表示起始游览时间,end表示结束游览的时间,从上表可以看到,存在游览时间重叠的情况,例如用户A的游览时间3-6和4-7重叠,可以认为游览时间是3-7。
我们现在要做的事就是把每个用户的存在重叠的游览时间合并到一起,最终并按照时间顺序排序显示。
注意:3-4和4-6也属于重叠的时间,可以合并为3-6。
先对一个用户进行时间合并并排序
取出一个用户的数据,用于测试操作:
tmp = df.groupby("uid").get_group('B')tmp
结果:
uid | start | end | |
---|---|---|---|
4 | B | 2 | 3 |
5 | B | 4 | 7 |
6 | B | 10 | 11 |
7 | B | 6 | 8 |
8 | B | 12 | 15 |
观察发现,要解决这个问题,我们首先需要对数据按照开始时间排序。
排序后:
tmp = tmp.sort_values('start')tmp
结果:
uid | start | end | |
---|---|---|---|
4 | B | 2 | 3 |
5 | B | 4 | 7 |
7 | B | 6 | 8 |
6 | B | 10 | 11 |
8 | B | 12 | 15 |
观察排序后的数据,我们就能很快的观察出合并的规则:
当前游览记录的的起始时间小于等于上一条记录的结束时间时就进行合并,非常简单:
result = []for uid, start, end in tmp.values: # 如果结果集中还没有数据或者当前记录的起始时间大于上一条记录的结束时间 # 就可以直接将当前记录加入到结果集 if not result or start > result[-1][2]: result.append([uid, start, end]) else: # 否则,说明可以将当前记录与上一条记录合并 # 合并方法是如果当前记录的结束时间大于上一条记录的结束时间, # 则上一条记录的结束时间修改为当前记录的结束时间 result[-1][2] = max(result[-1][2], end)tmp = pd.DataFrame(result, columns=["uid", "start", "end"])tmp
结果:
uid | start | end | |
---|---|---|---|
0 | B | 2 | 3 |
1 | B | 4 | 8 |
2 | B | 10 | 11 |
3 | B | 12 | 15 |
完整代码
然后我们整理一下完整的处理代码:
result = []for uid, tmp in df.groupby("uid"): tmp = tmp[["start", "end"]].sort_values('start') rows = [] for start, end in tmp.values: if not rows or start > rows[-1][2]: rows.append([uid, start, end]) else: rows[-1][2] = max(rows[-1][2], end) tmp = pd.DataFrame(rows, columns=["uid", "start", "end"]) result.append(tmp)result = pd.concat(result)result
结果:
uid | start | end | |
---|---|---|---|
0 | A | 1 | 2 |
1 | A | 3 | 7 |
2 | A | 8 | 9 |
0 | B | 2 | 3 |
1 | B | 4 | 8 |
2 | B | 10 | 11 |
3 | B | 12 | 15 |
0 | C | 14 | 15 |
好了,完结,撒花!
发表评论
最新留言
留言是一种美德,欢迎回访!
[***.207.175.100]2025年04月30日 03时01分46秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
Service Broker 无法工作的问题修复
2021-05-09
WCF WebHttp Services in .NET 4
2021-05-09
Powershell中禁止执行脚本解决办法
2021-05-09
HTTP协议状态码详解(HTTP Status Code)
2021-05-09
JMeter 中实现发送Java请求
2021-05-09
设计模式点滴
2021-05-09
数据库优化
2021-05-09
[备忘]域用户登陆出现“此工作站和主域间的信任关系失败”错误解决方法
2021-05-09
继续聊WPF——用Blend自定义Listview控件的列表头
2021-05-09
【.net 深呼吸】启动一个进程并实时获取状态信息
2021-05-09
OO_Unit2 多线程电梯总结
2021-05-09
json-lib的使用《二》
2021-05-09
LeetCode52题,别再问我N皇后问题了
2021-05-09
简单实用算法——字节位序反转
2021-05-09
webpack之带有可自动打开浏览器及热重载的基本配置
2021-05-09
前端的批量接口如何快速响应?有没有通用解决方案?
2021-05-09
Shader 入门笔记(一) 如何学习shader
2021-05-09
Huffman树及其编解码
2021-05-09
分布式、高并发、高性能场景(抢购、秒杀、抢票、限时竞答)数据一致性解决方案
2021-05-09