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

基于AND条件与严格匹配的DataFrame发票支付匹配问题

问题描述

需要将df1中DocN列的发票支付记录与df2中TXT列的数据匹配,同时满足DocArt1与DocArt2严格相等的条件,最终输出包含DocN、DocSum及对应支付详情(DocP、Date)的结果表。现有代码无法得到预期输出,需排查修正。


原始数据集

df1(发票数据)

DocNDocSumDocArt1
INV0011000A001
INV0022500B002
INV0031500A001

df2(支付数据)

DocPDateTXTDocArt2
PAY0012024-01-10支付INV001A001
PAY0022024-01-15支付INV002B002
PAY0032024-01-20支付INV001A001
PAY0042024-01-25支付INV003A001

尝试代码

import pandas as pd

# 构造示例数据
df1 = pd.DataFrame({
    'DocN': ['INV001', 'INV002', 'INV003'],
    'DocSum': [1000, 2500, 1500],
    'DocArt1': ['A001', 'B002', 'A001']
})

df2 = pd.DataFrame({
    'DocP': ['PAY001', 'PAY002', 'PAY003', 'PAY004'],
    'Date': ['2024-01-10', '2024-01-15', '2024-01-20', '2024-01-25'],
    'TXT': ['支付INV001', '支付INV002', '支付INV001', '支付INV003'],
    'DocArt2': ['A001', 'B002', 'A001', 'A001']
})

# 尝试的匹配逻辑
result = pd.merge(df1, df2, left_on='DocN', right_on='TXT', how='left')
result = result[result['DocArt1'] == result['DocArt2']]
result = result[['DocN', 'DocSum', 'DocP', 'Date']]

预期输出

DocNDocSumDocPDate
INV0011000PAY0012024-01-10
INV0011000PAY0032024-01-20
INV0022500PAY0022024-01-15
INV0031500PAY0042024-01-25

问题排查与修正

问题根源

原代码直接用DocN和TXT做merge匹配,但TXT是包含DocN的字符串(如支付INV001),并非与DocN完全相等,导致匹配失败,无法得到有效结果。

修正代码

import pandas as pd

# 构造示例数据
df1 = pd.DataFrame({
    'DocN': ['INV001', 'INV002', 'INV003'],
    'DocSum': [1000, 2500, 1500],
    'DocArt1': ['A001', 'B002', 'A001']
})

df2 = pd.DataFrame({
    'DocP': ['PAY001', 'PAY002', 'PAY003', 'PAY004'],
    'Date': ['2024-01-10', '2024-01-15', '2024-01-20', '2024-01-25'],
    'TXT': ['支付INV001', '支付INV002', '支付INV001', '支付INV003'],
    'DocArt2': ['A001', 'B002', 'A001', 'A001']
})

# 从TXT中提取DocN(适配"支付+DocN"的格式)
df2['extracted_DocN'] = df2['TXT'].str.extract(r'(INV\d+)')

# 多条件合并:同时匹配DocN和DocArt字段
result = pd.merge(
    df1, 
    df2, 
    left_on=['DocN', 'DocArt1'], 
    right_on=['extracted_DocN', 'DocArt2'], 
    how='left'
)

# 筛选目标列并去除未匹配的空值行
result = result[['DocN', 'DocSum', 'DocP', 'Date']].dropna().reset_index(drop=True)

print(result)

修正说明

  1. 提取匹配字段:用正则表达式从TXT中提取出纯DocN值,解决字符串不完全匹配的问题。
  2. 多条件合并:合并时同时校验DocN和DocArt两个条件,确保匹配逻辑的严谨性,避免后续额外过滤操作。
  3. 结果清理:移除left join产生的未匹配空值行,得到符合预期的结果集。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 18:17:36