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
相关产品推荐
相关产品推荐

