如何在Pandas DataFrame中按条件移除重复交易(同金额+1天内)
移除Pandas DataFrame中金额相同且日期间隔1天内的重复交易
给定如下Pandas DataFrame:
import pandas as pd columns = ['Date', 'Description', 'Original Description', 'Amount', 'Transaction Type', 'Category', 'Account Name'] data =[['2023-07-31', 'HOUSTON METHODIST BILLNG', 'HOUSTON METHODIST BILLNG', 6208.8, 'debit', 'Medical', 'Chase Freedom'], ['2023-08-01', 'HOUSTON METHODIST BILLNG', 'HOUSTON METHODIST BILLNG', 6208.8, 'debit', 'Medical', 'Chase Freedom'], ['2023-12-01', 'Hilton Mar Caribe Cancún', 'AplPay HILTON MAR CABENITO JUAREZ ME', 2314.55, 'debit', 'Travel & Vacation', 'Amex EveryDay® Card'], ['2023-11-30', 'HILTON MAR CARIBE USD', 'HILTON MAR CARIBE USD', 2314.55, 'debit', 'Travel & Vacation', 'Amex EveryDay® Card'], ['2023-09-29', 'STATE FARM INSURANCEBLOOMINGTON IL', 'STATE FARM INSURANCEBLOOMINGTON IL', 462.54, 'debit', 'Bills & Utilities', 'Amex EveryDay® Card'], ['2023-10-31', 'STATE FARM INSURANCEBLOOMINGTON IL', 'STATE FARM INSURANCEBLOOMINGTON IL', 462.54, 'debit', 'Bills & Utilities', 'Amex EveryDay® Card'], ['2023-11-29', 'STATE FARM INSURANCE', 'STATE FARM INSURANCE', 462.54, 'debit', 'Bills & Utilities', 'Amex EveryDay® Card'], ] df = pd.DataFrame(data, columns=columns)
其中行0与1、行2与3属于重复交易(金额相同且日期间隔1天内),但直接按Amount列去重会误删State Farm的几笔非重复交易(金额相同但日期间隔远超1天)。需要实现逻辑:仅移除金额相同且交易日期间隔在1天内的重复项。
实现步骤
- 转换日期列为datetime类型,支持日期差计算
- 按金额分组,每组内按日期排序,确保同金额交易按时间顺序排列
- 计算每组内相邻交易的日期差,标记出日期差≤1天的重复项
- 过滤掉重复项,保留有效交易
代码实现
# 1. 转换日期列格式 df['Date'] = pd.to_datetime(df['Date']) # 2. 按金额+日期排序,确保同金额交易按时间顺序排列 df_sorted = df.sort_values(['Amount', 'Date']).reset_index(drop=True) # 3. 计算每组内相邻交易的日期差,标记重复项 df_sorted['date_diff'] = df_sorted.groupby('Amount')['Date'].diff().dt.days # 标记:金额相同且日期差≤1天的为重复(排除每组第一行) df_sorted['is_duplicate'] = (df_sorted['date_diff'] <= 1) & (df_sorted['date_diff'].notna()) # 4. 过滤重复项,保留有效交易 df_deduplicated = df_sorted[~df_sorted['is_duplicate']].drop(columns=['date_diff', 'is_duplicate']) # 可选:恢复原DataFrame的行顺序 df_deduplicated = df_deduplicated.sort_index().reset_index(drop=True) print(df_deduplicated)
代码说明
pd.to_datetime(df['Date']):将字符串日期转为datetime类型,是计算日期差的前提sort_values(['Amount', 'Date']):同金额交易按日期排序,保证相邻行是时间连续的交易groupby('Amount')['Date'].diff().dt.days:在每个金额组内,计算当前行与上一行的日期间隔(单位:天)(df_sorted['date_diff'] <= 1) & (df_sorted['date_diff'].notna()):精准标记出需要删除的重复项(每组第一行无前置交易,不标记)~df_sorted['is_duplicate']:过滤掉重复行,保留有效交易
结果验证
运行后得到的df_deduplicated会保留:
- 2023-07-31的HOUSTON METHODIST交易(移除8月1日的重复项)
- 2023-11-30的Hilton交易(移除12月1日的重复项)
- 所有三笔State Farm的交易(日期间隔均超过1天,不属于重复)
内容的提问来源于stack exchange,提问作者ankitj
相关产品推荐
相关产品推荐

