pandas 检查表单指定列是否有重复数据【实际业务实践】

一、业务需求

财务系统中提报业务时,需要检查业务附件中的两列是否在当前电子表格内重复。
比如检查 票据编号 + 子票区间 是否有重复。

二、业务数据

以下是脱敏的真实业务数据。

制单号 制单状态 处理结果 业务种类 票据包号 子票区间 票据类型 票面金额 申请金额 对手方名称 出票日期 到期日期
1 208840626133302831331 交易成功 签收发送人行成功 背书转让签收 65301107020240302831331 19112233,26275680 银承(含财票) 71634.5 71634.5 北京杜甫作诗有限公司 2024-03-22 2024-09-12
2 208840626133302831330 交易成功 签收发送人行成功 背书转让签收 29000201420240302831330 1212955345,1217466500 银承(含财票) 45111.6 45111.6 北京杜甫作诗有限公司 2024-03-13 2024-09-13
3 208840626133302831329 交易成功 签收发送人行成功 背书转让签收 58401349620240402831329 337536497,348571889 银承(含财票) 110354 110354 北京杜甫作诗有限公司 2024-04-10 2024-07-15
4 208840626133302831328 交易成功 签收发送人行成功 背书转让签收 45802801320240302831328 69634753,80909193 银承(含财票) 112744 112744 北京杜甫作诗有限公司 2024-03-21 2024-09-21
5 208840626133302831327 交易成功 签收发送人行成功 背书转让签收 30300101020240302831327 1,3000000 银承(含财票) 30000 30000 北京杜甫作诗有限公司 2024-03-15 2024-09-15
6 208840626133302831326 交易成功 签收发送人行成功 背书转让签收 36205006620240302831326 7038872,7379009 银承(含财票) 3401.38 3401.38 北京杜甫作诗有限公司 2024-03-20 2024-09-20
7 208840626133302831325 交易成功 签收发送人行成功 背书转让签收 65301107020240302831325 9249633,18369632 银承(含财票) 91200 91200 北京杜甫作诗有限公司 2024-03-22 2024-09-12
8 208840626133302831324 交易成功 签收发送人行成功 背书转让签收 71553411920240302831324 1,14248000 银承(含财票) 142480 142480 北京杜甫作诗有限公司 2024-03-25 2024-09-25
9 208840626133302831323 交易成功 签收发送人行成功 背书转让签收 33101045120240302831323 19133190,30849752 银承(含财票) 117166 117166 北京杜甫作诗有限公司 2024-03-26 2024-09-26
10 208840626133302831322 交易成功 签收发送人行成功 背书转让签收 29000201420240302831330 1212955345,1217466500 银承(含财票) 18510 18510 北京杜甫作诗有限公司 2024-03-13 2024-09-13
11 208840626133302831321 交易成功 签收发送人行成功 背书转让签收 33750001520240302831321 1,5340534 银承(含财票) 53405.3 53405.3 北京杜甫作诗有限公司 2024-03-26 2024-09-26
12 208840626133302831320 交易成功 签收发送人行成功 背书转让签收 10000092920240402831320 1,257215 银承(含财票) 2572.15 2572.15 北京杜甫作诗有限公司 2024-04-24 2024-07-25
13 208840626133302831319 交易成功 签收发送人行成功 背书转让签收 52800021020240302831319 209605906,211605905 银承(含财票) 20000 20000 北京杜甫作诗有限公司 2024-03-28 2024-09-23
14 208840626133302831318 交易成功 签收发送人行成功 背书转让签收 10000113920240302831318 33000001,38000000 银承(含财票) 50000 50000 常州陆游电子科技有限公司 2024-03-22 2024-09-22
15 208840626133302831317 交易成功 签收发送人行成功 背书转让签收 10002609920240202831317 75000001,100000000 银承(含财票) 250000 250000 常州陆游电子科技有限公司 2024-02-26 2024-08-26
16 208840626133302831316 交易成功 签收发送人行成功 背书转让签收 33553501220240302831316 1,65611620 银承(含财票) 656116 656116 常州陆游电子科技有限公司 2024-03-06 2024-09-05
17 208840626133302831315 交易成功 签收发送人行成功 背书转让签收 29000005120240302831315 1,21546840 银承(含财票) 215468 215468 常州陆游电子科技有限公司 2024-03-19 2024-09-19
18 208840626133302831314 交易成功 签收发送人行成功 背书转让签收 30300101020240302831327 1,3000000 银承(含财票) 150000 150000 重庆欧阳修电器有限公司 2024-06-25 2024-12-25
19 208840626133302831313 交易成功 签收发送人行成功 背书转让签收 61101702920240602831313 1,10000000 银承(含财票) 100000 100000 重庆欧阳修电器有限公司 2024-06-18 2024-12-18
20 208840626133302831312 交易成功 签收发送人行成功 背书转让签收 61101702920240602831313 1,10000000 银承(含财票) 100000 100000 重庆欧阳修电器有限公司 2024-06-20 2024-12-20
21 208840626133302831311 交易成功 签收发送人行成功 背书转让签收 33101045120240302831311 19133190,30849752 银承(含财票) 81209.5 81209.5 武汉李清照美妆有限公司 2024-05-08 2024-08-08

三、解决方案

  1. 将两列拼接在一块;
  2. 使用 pandas 检查拼接列是否有重复,如有则标记;
  3. 取出重复的票据号。

参考代码:

import pandas as pd
from loguru import logger


def is_ticket_duplicate(df: pd.DataFrame) -> str:
    """[票据包号和子票区间]是否重复"""
    df = df[["票据包号", "子票区间"]]
    ticket_number = df["票据包号"] + "," + df["子票区间"]
    duplicate_flag = ticket_number.duplicated()
    if any(duplicate_flag):
        duplicate_number = "|".join(ticket_number[duplicate_flag].astype(str).tolist())
        logger.warning(f"发现重复票据号:{duplicate_number}")
        return duplicate_number
    return None

这里定义了一个函数,有重复数据时,返回重复的票据号(同一票据号重复多次时只返回一个),没有则返回 None
调用此函数时,判断返回为 None 时说明无重复,不为 None 时,返回的就是重复的票据号。

调用效果如下图所示。

image

posted @ 2024-07-07 22:13  那个白熊  阅读(52)  评论(0编辑  收藏  举报