You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:32:12