R语言按用户ID分组如何保留$identify事件后的前5行数据
实现方案
核心逻辑
- 基于已按用户ID、时间排序的DataFrame按用户ID分组处理,无需额外排序
- 先过滤没有
$identify事件的用户,定位每个用户首个$identify事件的位置 - 新增紧邻事件判断:如果
$identify的下一条事件为Welcome - Confirm Emails,仅保留$identify作为该用户路径的最后一个事件 - 不满足上述触发条件时,保留
$identify之后的前5条事件(可调整切片规则实现包含$identify在内的共5条路径记录)
代码示例
import pandas as pd def process_user_path(group): # 重置分组内索引,避免全局索引不连续导致的取值错误 group_inner = group.reset_index(drop=True) # 定位当前用户首个$identify事件的位置 identify_pos = group_inner[group_inner['事件'] == '$identify'].index if len(identify_pos) == 0: # 无$identify事件的用户直接过滤 return pd.DataFrame() first_identify_pos = identify_pos[0] total_rows = len(group_inner) # 若$identify是用户的最后一条记录,直接返回 if first_identify_pos == total_rows - 1: return group_inner.iloc[[first_identify_pos]] # 检查$identify下一条事件是否为目标邮件事件 next_event = group_inner.iloc[first_identify_pos + 1]['事件'] if next_event == 'Welcome - Confirm Emails': # 仅保留$identify作为路径终点 return group_inner.iloc[[first_identify_pos]] else: # 原需求:取$identify之后的前5条记录 # 若需要包含$identify在内共5条,修改为 group_inner.iloc[first_identify_pos : first_identify_pos + 5] end_pos = min(first_identify_pos + 5, total_rows - 1) return group_inner.iloc[first_identify_pos + 1 : end_pos + 1] # 替换df为你的DataFrame变量名,需保证df已提前按用户ID、时间升序排序 result = df.groupby('用户ID', group_keys=False).apply(process_user_path).reset_index(drop=True)
内容的提问来源于stack exchange,提问作者d3hero23
相关产品推荐
相关产品推荐

