打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
Pandas基础|用户游览日志时间合并排序

作者:小小明,Pandas数据处理专家,致力于帮助无数数据从业者解决数据处理难题。

需求说明

有一份下面格式用户游览日志的数据(复制下面显示的表格后,运行下面的代码才会出现相同的结果):

import pandas as pd

df = pd.read_clipboard()
df

结果:

uidstartend
0A12
1A47
2A36
3A89
4B23
5B47
6B1011
7B68
8B1215
9C1415

其中uid表示每个用户,start表示起始游览时间,end表示结束游览的时间,从上表可以看到,存在游览时间重叠的情况,例如用户A的游览时间3-6和4-7重叠,可以认为游览时间是3-7。

我们现在要做的事就是把每个用户的存在重叠的游览时间合并到一起,最终并按照时间顺序排序显示。

注意:3-4和4-6也属于重叠的时间,可以合并为3-6。

先对一个用户进行时间合并并排序

取出一个用户的数据,用于测试操作:

tmp = df.groupby("uid").get_group('B')
tmp

结果:

uidstartend
4B23
5B47
6B1011
7B68
8B1215

观察发现,要解决这个问题,我们首先需要对数据按照开始时间排序。

排序后:

tmp = tmp.sort_values('start')
tmp

结果:

uidstartend
4B23
5B47
7B68
6B1011
8B1215

观察排序后的数据,我们就能很快的观察出合并的规则:

当前游览记录的的起始时间小于等于上一条记录的结束时间时就进行合并,非常简单:

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

结果:

uidstartend
0B23
1B48
2B1011
3B1215

完整代码

然后我们整理一下完整的处理代码:

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

结果:

uidstartend
0A12
1A37
2A89
0B23
1B48
2B1011
3B1215
0C1415

好了,完结,撒花!

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
2 MS Interview problems
Python编程语言学习:在pandas中设置某字段为索引列,并在dataframe中指定该索引列
利用Python进行数据分析pandas入门(五)(1)
Http Session介绍与应用
pandas 数据规整
Pandas100秒处理一亿行数据
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服