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

基于Pandas的分组累计求和与日期条件的跨客户发票-支付匹配问题求解

问题描述

我有三个Pandas DataFrame,分别用于记录客户相似度、发票和支付数据:

  • df_sim:记录因数据错误导致支付与我方发票不匹配的客户(Cust1),以及与其名称相似或相同的其他客户(Cust2)的相似度信息,需要为每一组Cust1-Cust2判断是否匹配成功。
  • df_inv:记录我方开具给df_sim中Cust1客户的发票数据,包含客户名称、发票金额、发票日期字段。
  • df_paym:记录我方系统中df_sim里Cust2客户的支付数据,包含客户名称、支付金额、支付日期字段。

具体需求

  • 对每个Cust1客户,需将其发票金额按「发票日期≤支付日期」的条件进行累计求和,并在1美元的误差阈值内,与对应Cust2客户的支付金额的所有可能组合进行匹配,直到累计金额达到发票总和。
  • 若某一组Cust1-Cust2匹配成功(例如df_sim中第一行的ABC-ABC组合),则该Cust1对应的后续相似客户行需跳过匹配。
  • 最终需为三个DataFrame添加「Match (Y/N)」列,标识对应行是否匹配成功,预期输出如下:

df_sim(客户相似度表)

Cust1Cust2相似度百分比(Similarity%)是否匹配(Match (Y/N))
ABCABC1.00Y
ABCABB0.66N
ABCAYZ0.33N
DEFDEA0.66N
DEFDEB0.66Y
DEFDEC0.33N
GHIGAB0.33Y
LMNLMA0.66N
LMNLAB0.33Y
OPQOPA0.66Y

df_inv(发票表)

Cust1金额(Amount)日期(Date)是否匹配(Match (Y/N))
ABC10.0001/01/21Y
ABC10.0001/01/21Y
ABC29.5001/01/21Y
DEF40.0001/02/21Y
GHI49.0001/02/21Y
GHI10.0001/02/21Y
LMN100.0001/03/21Y
LMN0.9901/03/21Y
OPQ190.0001/03/21Y
OPQ10.9901/03/21Y

df_paym(支付表)

Cust1金额(Amount)日期(Date)是否匹配(Match (Y/N))
ABC50.0001/02/21Y
ABB50.0001/02/21N
DEA40.0031/12/20N
DEB40.0001/03/21Y
GAB60.0001/03/21Y
LMA98.0001/04/21N
LAB100.9901/04/21Y
OPA200.0001/04/21Y

现有代码问题

我已编写了初步代码,但仅能实现发票与支付金额的精确匹配,无法实现日期条件判断及支付组合的累计匹配逻辑,现有代码如下:

import pandas as pd
df_sim = pd.DataFrame({'Cust1':['ABC', 'ABC', 'ABC', 'DEF','DEF','DEF','GHI', 'LMN', 'LMN', 'OPQ'], 'Cust2': ['ABC', 'ABB', 'AYZ', 'DEA', 'DEB', 'DEC', 'GAB', 'LMA', 'LAB', 'OPA'], 'similarity%': [1, .66, .33, .66, .66, .33, .33, .66, .33, .66]})
df_inv = pd.DataFrame({'Cust1':['ABC', 'ABC', 'ABC', 'DEF', 'GHI', 'GHI', 'LMN', 'LMN', 'OPQ', 'OPQ'], 'Amount': [10, 10, 29.5, 40, 49, 10, 100, 0.99, 190, 10.99], 'Date': ['01/01/2021', '01/01/2021', '01/01/2021','01/02/2021', '01/02/2021','01/02/2021','01/03/2021','01/03/2021','01/03/2021','01/03/2021']})
df_paym = pd.DataFrame({'Cust1':['ABC', 'ABB', 'DEA', 'DEB', 'GAB', 'LMA', 'LAB', 'OPA'], 'Amount': [50, 50, 40, 40, 60, 98, 100.99, 200], 'Date': ['01/02/2021', '01/02/2021', '31/12/2020', '01/03/2021', '01/03/2021', '01/04/2021', '01/04/2021','01/04/2021']})
df_inv_grpd = df_inv.groupby(['Cust1', 'Date'])['Amount'].sum().reset_index()
for cust1, cust2 in zip(df_sim['Cust1'], df_sim['Cust2']):
    if df_inv_grpd[df_inv_grpd['Cust1']==cust1]['Amount'].values in (df_paym[df_paym['Cust1']==cust2]['Amount'].to_numpy()):
        print(cust1, " ", cust2, " ", ":", 'OK')
    else:
        print(cust1, " ", cust2, " ", ":", 'NO')

请求协助

请帮忙完善代码,实现以下功能:

  1. 满足「发票日期≤支付日期」条件的分组累计求和
  2. 支付金额组合的累计匹配逻辑
  3. 1美元误差阈值的判断
  4. 匹配成功后跳过该Cust1后续相似客户的逻辑

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 21:49:06