专栏首页凹凸玩数据Pandas高端操作:10行代码解决用户游览日志合并排序问题

Pandas高端操作:10行代码解决用户游览日志合并排序问题

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

先说问题

下面有一份用户游览日志的数据(复制下面显示的表格后,运行下面的代码才会出现相同的结果,详见《在剪贴板上读取/写入数据,太方便了吧!》):

import pandas as pd
df = 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

好了,完结,撒花!

记得一键三连哦~

本文分享自微信公众号 - 凹凸数据(alltodata),作者:小小明

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2021-01-11

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 用python重温统计学基础:离散型概率分布

    在上一篇描述性统计中提到数据分析的对象主要是结构化化数据,而所有的结构化数据可以从三个维度进行描述,即数据的集中趋势描述,数据的离散程度描述和数据的分布形态描述...

    朱小五
  • 不让数据动起来,那PPT多没意思啊

    数据暴增的年代,数据科学家、分析师在被要求对数据有更深的理解与分析的同时,还需要将结果有效地传递给他人。如何让目标听众更直观地理解?当然是将数据可视化啊,而且最...

    朱小五
  • 刚学完python自动化系列文章,就接了一单任务

    该文是一个群友找到我,然后让我做的,要求我下午两点之前提交给他。题目并不难,只有一个要求:必须使用openpyxl操作。

    朱小五
  • 如何写好状态机(二)

    今天给大侠带来如何写好状态机(二),由于篇幅比较长,如何写好状态机分成三篇呈现。上一篇已经说了状态机的基本概念,此篇带来如何写好状态机部分,话不多说,上货。

    FPGA技术江湖
  • 1. 从系统架构到Hello World

    Android起源与发展:   Android操作系统最初在2003年的时候由Andy Rubin开发,主要支持手机。2005年8月由Google收购注资。20...

    SecondWorld
  • Android Studio使用recyclerview实现展开和折叠功能(在之前的微信页面基础之上)

    依然是xml文件的设计,使用了两个RelativeLayout,zu作为主布局和副布局,里面都加入textview显示内容,在副布局里加入一个imageview...

    砸漏
  • android ToolBar的简单使用

    使用ToolBar必须在Activity配置theme中去掉ActionBar,例如使用

    砸漏
  • ​细微处谈前端重构

    如果你的项目使用的前端模板,后端路由+渲染,本文可能不太符合。本文主要针对SPA类型前端应用。

    coder_koala
  • php和C#的yield迭代器实现方法对比分析

    本文实例讲述了php和C#的yield迭代器实现方法对比。分享给大家供大家参考,具体如下:

    砸漏
  • Linux和Windows下ping的区别

    Ping 是Windows自带的一个DOS命令。利用它可以检查网络是否能够连通,用好它可以很好地帮助我们分析判定网络故障。该命令可以加许多参数使用,键入Ping...

    用户7656790

扫码关注云+社区

领取腾讯云代金券