R语言处理点击流数据:按会话用户ID移除连续重复事件
点击流数据连续重复页面清洗方案
清洗规则确认
处理前先明确规则,避免误操作破坏数据准确性:
- 原始数据集字段:
Session(会话标识)、UserID(用户标识)、Duration(min)(会话总时长,单位分钟)、id(原路径序号)、Page#(浏览页面标识) - 仅删除同Session+同UserID分组下,连续相邻的重复Page#记录,非连续的同页面访问(比如路径「首页→详情页→首页」里的两次首页访问)属于正常跳转,必须保留
- 所有保留记录的
Duration(min)字段保留原始值,不做重算 - 清洗完成后按同组内的浏览先后顺序,重新生成从1开始的连续
id序号
Pandas 实现代码(适用于本地小批量数据处理)
核心思路是通过相邻行值对比标记连续重复项,不要直接用全局去重方法,避免误删非连续的有效访问记录。
import pandas as pd # 1. 读取原始数据,替换为你自己的文件路径,支持csv、excel等格式 df = pd.read_csv("你的点击流原始数据文件.csv") # 注意:如果原始数据没有按浏览时间升序排列,先执行排序,否则去重逻辑会出错 # df = df.sort_values(by=["Session", "UserID", "浏览时间戳字段名"]) # 2. 标记连续重复的Page记录 df["is_dup"] = df.groupby(["Session", "UserID"])["Page#"].shift(1) == df["Page#"] # 过滤掉重复项 df_clean = df[~df["is_dup"]].copy() # 3. 重新生成连续的路径id df_clean["id"] = df_clean.groupby(["Session", "UserID"]).cumcount() + 1 # 4. 删除临时标记列,导出清洗后的数据 df_clean = df_clean.drop(columns=["is_dup"]) df_clean.to_csv("清洗后点击流数据.csv", index=False)
SQL 实现代码(适用于数仓大批量数据处理)
逻辑和Pandas版本完全一致,用窗口函数取上一条访问的页面做对比:
WITH mark_duplicate AS ( SELECT Session, UserID, `Duration(min)`, Page#, -- 取同会话同用户的上一条访问页面 LAG(Page#, 1) OVER (PARTITION BY Session, UserID ORDER BY id) AS prev_page FROM 原始点击流表名 ) SELECT Session, UserID, `Duration(min)`, -- 重新生成连续路径序号 ROW_NUMBER() OVER (PARTITION BY Session, UserID ORDER BY id) AS id, Page# FROM mark_duplicate -- 过滤第一条记录(无上一页)和上一页与当前页不同的有效记录 WHERE prev_page IS NULL OR prev_page != Page#
避坑提醒
- 严禁直接使用全局去重方法(比如直接按Session+UserID+Page#去重),这类操作会删除所有非连续的同页面访问记录,完全扭曲真实用户旅程路径
- 如果原始数据的
id字段不是严格按浏览时间递增的,排序时必须替换为真实的浏览时间戳字段,否则路径顺序会错乱 Duration(min)是会话级统计字段,不需要随记录删除重新计算,保留原值即可匹配分析口径
内容的提问来源于stack exchange,提问作者user2845095
相关产品推荐
相关产品推荐

