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

Python基于二进制标识列在pandas DataFrame中查找移除重复数据

处理逻辑

首先明确过滤和去重规则:

  • 第一步剔除REVERSAL_FLAG = 1的冲正交易
  • 重复交易判定维度为ID、AMOUNT、STORE、CARDNUMBER四个字段完全一致
  • 仅保留存在重复记录的分组(即分组内至少有1条DUPLICATED_FLAG = 1的记录),无重复的单独交易直接过滤
  • 同一分组内按交易时间升序排序,保留原始交易和对应重复交易

实现代码

import pandas as pd

# 构造示例DataFrame
data = [['1',5, 'cvs', '4567', '4/6/2020  12:56:40',0,0], 
['1',5, 'cvs', '4567', '4/6/2020  12:56:41',1,0], 
['2',6, 'walgreens', '7897', '4/9/2020  12:56:41',0,0],
['2',7, 'target', '7897', '4/10/2020  12:56:41',0,0],
['2',8, 'walmart', '9898', '4/8/2020  12:56:41',0,1],
['2',6, 'walgreens', '7897', '4/9/2020  12:56:41',1,0]]
# 修正原列名拼写错误DULICATED_FLAG为DUPLICATED_FLAG
df = pd.DataFrame(data, columns = ['ID', 'AMOUNT','STORE','CARDNUMBER','PURCHASETIME','DUPLICATED_FLAG','REVERSAL_FLAG'])

# 转换购买时间为datetime格式,方便排序
df['PURCHASETIME'] = pd.to_datetime(df['PURCHASETIME'])

# 过滤冲正交易
df_filtered = df[df['REVERSAL_FLAG'] == 0].copy()

# 筛选出存在重复记录的分组
group_dim = ['ID', 'AMOUNT', 'STORE', 'CARDNUMBER']
has_dup_groups = df_filtered.groupby(group_dim)['DUPLICATED_FLAG'].max().reset_index()
has_dup_groups = has_dup_groups[has_dup_groups['DUPLICATED_FLAG'] == 1][group_dim]

# 匹配保留存在重复的分组的所有记录,按时间排序
result = df_filtered.merge(has_dup_groups, on=group_dim, how='inner')
result = result.sort_values(by=group_dim + ['PURCHASETIME']).reset_index(drop=True)

print(result)

输出说明

运行代码后输出结果和你给出的期望结果一致,仅你示例中最后一条记录的PURCHASETIME写为12:57:41属于笔误,实际运行结果对应时间和源数据一致。

内容的提问来源于stack exchange,提问作者NightDog

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 10:57:03