如何仅对Pandas DataFrame中指定用户按操作去重并保留最早记录
实现方案
核心逻辑是将数据集拆分为指定用户数据和其他用户数据两部分单独处理,再合并结果,逻辑清晰不易出错。
代码实现
首先导入依赖(如果已经导入可跳过):
import pandas as pd
方法1:拆分合并法(最易理解)
# 定义目标用户 target_user = 1234 # 拆分出其他用户的全部数据,无需处理 df_others = df[df['User ID'] != target_user] # 处理目标用户:先按日期升序排序(确保最早记录在前),再按指定列去重保留第一条 df_target = df[df['User ID'] == target_user]\ .sort_values('Date', ascending=True)\ .drop_duplicates(subset=['User ID', 'Action ID'], keep='first') # 合并两部分结果,ignore_index重置行索引 df_result = pd.concat([df_target, df_others], ignore_index=True)
方法2:布尔索引法(无需拆分合并,一步到位)
target_user = 1234 # 构造保留条件:要么不是目标用户,要么是目标用户且是对应操作的第一条记录 keep_mask = (df['User ID'] != target_user) | \ (~df[df['User ID'] == target_user].duplicated(subset=['User ID', 'Action ID'], keep='first')) df_result = df[keep_mask].reset_index(drop=True)
补充说明
drop_duplicates的subset参数指定了仅按User ID和Action ID两列判断重复,完全符合需求sort_values('Date')是为了保证无论原始数据顺序如何,都能正确保留每类操作的最早记录,如果原始数据已经按日期升序排列,可以省略这一步- 如果你更习惯用groupby写法,处理目标用户的部分也可以替换为以下代码,效果完全一致:
df_target = df[df['User ID'] == target_user]\ .sort_values('Date')\ .groupby(['User ID', 'Action ID'], as_index=False)\ .first()
内容的提问来源于stack exchange,提问作者starlings
相关产品推荐
相关产品推荐

