如何在Pandas中仅对指定类别按连续事件保留首条去重?
Pandas实现自定义规则的去重需求
这是个很实用的自定义去重场景,针对不同事件类型做差异化处理,我来一步步帮你实现:
先明确核心规则
- 仅对
event_name列的fast_order类型做去重,process_now类型保留所有记录 - 连续出现的
fast_order为一组,每组只保留第一条记录 - 始终保留首次出现的条目
第一步:构造原始数据集
先把你给出的原始数据转换成Pandas DataFrame:
import pandas as pd data = { 'User_id': [1,1,1,1,1,1,2,2,2,2,2,2,2,2,2], 'event_name': [ 'process_now','process_now','process_now','fast_order','fast_order','process_now', 'process_now','process_now','fast_order','fast_order','fast_order','process_now','fast_order','fast_order','process_now' ], 'timestamp': [ '08:00:01','08:00:02','08:00:03','08:00:04','08:00:05','08:00:06', '08:00:01','08:00:02','08:00:03','08:00:04','08:00:05','08:00:06','08:00:07','08:00:08','08:00:09' ] } df = pd.DataFrame(data)
第二步:实现自定义去重逻辑
核心思路是先识别每个用户下连续相同的事件分组,再对fast_order组只保留第一条:
# 1. 给每个用户的连续事件标记分组ID # 原理:比较当前行和上一行的event_name,不同则分组ID+1,确保连续相同事件在同一组 df['group_id'] = (df['event_name'] != df.groupby('User_id')['event_name'].shift()).cumsum() # 2. 拆分处理两种事件类型 # 保留所有process_now记录 process_now_df = df[df['event_name'] == 'process_now'] # 对fast_order按用户+分组ID取第一条 fast_order_first_df = df[df['event_name'] == 'fast_order'].groupby(['User_id', 'group_id']).first().reset_index() # 3. 合并结果并按用户和时间排序 final_df = pd.concat([process_now_df, fast_order_first_df]) \ .sort_values(by=['User_id', 'timestamp']) \ .reset_index(drop=True) \ .drop(columns='group_id') # 去掉临时的分组ID列
验证结果
打印final_df就能得到你期望的输出:
User_id event_name timestamp 0 1 process_now 08:00:01 1 1 process_now 08:00:02 2 1 process_now 08:00:03 3 1 fast_order 08:00:04 4 1 process_now 08:00:06 5 2 process_now 08:00:01 6 2 process_now 08:00:02 7 2 fast_order 08:00:03 8 2 process_now 08:00:06 9 2 fast_order 08:00:07 10 2 process_now 08:00:09
内容的提问来源于stack exchange,提问作者Nabih Bawazir
相关产品推荐
相关产品推荐

