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

如何在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天内的重复项。


实现步骤

  1. 转换日期列为datetime类型,支持日期差计算
  2. 按金额分组,每组内按日期排序,确保同金额交易按时间顺序排列
  3. 计算每组内相邻交易的日期差,标记出日期差≤1天的重复项
  4. 过滤掉重复项,保留有效交易

代码实现

# 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 22:23:25