如何用Pandas删除重复交易记录,按客户ID保留前两条?
解决方法:按客户分组保留前两条交易记录
没问题,这个需求用pandas就能轻松实现——drop_duplicates确实没法直接完成「按组取前N条」的操作,咱们换个思路来处理:
步骤1:构造/加载数据
先假设你已经用pandas加载了数据集,这里先还原你的示例数据:
import pandas as pd data = { 'cust_ID': ['abc', 'abc', 'abc', 'abc', 'def', 'ghi', 'def'], 'transaction_Date': ['01/01/2013', '02/09/2013', '06/06/2015', '09/09/2019', '02/01/2015', '09/09/2013', '09/02/2014'] } df = pd.DataFrame(data)
步骤2:确保日期排序正确(关键)
因为你需要保留每个客户的前两条交易记录(默认是最早的两条),所以先把日期转为datetime类型,保证排序逻辑准确:
# 转换日期格式(根据你的实际日期格式调整format参数) df['transaction_Date'] = pd.to_datetime(df['transaction_Date'], format='%d/%m/%Y') # 按客户ID+交易日期升序排序,确保每组内的记录是按时间先后排列的 df = df.sort_values(['cust_ID', 'transaction_Date'])
步骤3:分组取前2条记录
用groupby+head方法直接筛选每组的前2行:
# 按cust_ID分组,每组保留前2条 result_df = df.groupby('cust_ID').head(2) # 如果需要恢复原来的日期字符串格式,执行这一步 result_df['transaction_Date'] = result_df['transaction_Date'].dt.strftime('%d/%m/%Y') print(result_df)
运行后会得到你期望的结果:
cust_ID transaction_Date 0 abc 01/01/2013 1 abc 02/09/2013 6 def 09/02/2014 4 def 02/01/2015 5 ghi 09/09/2013
替代方法:不改变原始顺序的筛选
如果你的原始数据顺序有特殊意义,不想打乱,可以用cumcount()给每组的行编号,再筛选编号小于2的行:
# 给每个客户的记录按原始顺序编号(从0开始) df['row_index'] = df.groupby('cust_ID').cumcount() # 筛选编号为0和1的记录(即前2条),然后删除辅助列 result_df = df[df['row_index'] < 2].drop('row_index', axis=1)
这个方法会严格保留你原始数据中每个客户出现的前两条记录,不会改变整体的行顺序。
内容的提问来源于stack exchange,提问作者asspsss
相关产品推荐
相关产品推荐

