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

小小明 凹凸数据

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

先说问题

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

import pandas as pddf = pd.read_clipboard() #读取剪切板中的数据df

结果:

其中uid表示每个用户,start表示起始游览时间,end表示结束游览的时间,从上表可以看到,存在游览时间重叠的情况,例如用户A的游览时间3-6和4-7重叠,可以认为游览时间是3-7。
我们现在要做的事就是把每个用户的存在重叠的游览时间合并到一起,最终并按照时间顺序排序显示。
注意:3-4和4-6也属于重叠的时间,可以合并为3-6。

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

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

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

结果:

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

排序后:

tmp = tmp.sort_values('start')tmp

结果:

观察排序后的数据,我们就能很快的观察出合并的规则:
当前游览记录的的起始时间小于等于上一条记录的结束时间时就进行合并,非常简单:

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

结果:

完整代码

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

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

结果:

好了,完结,撒花!
记得一键三连哦~

©著作权归作者所有:来自51CTO博客作者mb5fe18e5a55d8d的原创作品,如需转载,请注明出处,否则将追究法律责任

更多相关文章

  1. 44万条数据揭秘:如何成为网易云音乐评论区的网红段子手?
  2. 2000万条直播数据,揭秘斗鱼主播生存现状
  3. 破解X眼电影字体动态加密|凹凸玩数据
  4. Python爬取上万条大众点评数据,解读一线快餐品牌背后的秘密
  5. 放大招!耗时一个月,早起做了一个Python数据可视化APP?
  6. 收藏这些API,获取网易云音乐数据超轻松
  7. 如何用python进行数据分析——00环境配置
  8. Python爬取近十年TIOBE编程语言热度数据并可视化可视化
  9. 手把手教你用Selenium爬取拉勾网数据!

随机推荐

  1. 关于android:background="@drawable/bg_p
  2. Android网络检测
  3. Basics of Android : Part IV – Android
  4. 关于android studio 出现Error:Execution
  5. android framework java层服务 分析
  6. Android动画之Interpolator
  7. Animation
  8. Android (Android Studio)(Java) 实现Vie
  9. Android(安卓)adb ubuntu 64bit 不能运行
  10. Android在全屏状态下键盘覆盖输入框问题