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 |
三、解决方案
- 将两列拼接在一块;
- 使用 pandas 检查拼接列是否有重复,如有则标记;
- 取出重复的票据号。
参考代码:
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 时,返回的就是重复的票据号。
调用效果如下图所示。
有了计划记得推动,不要原地踏步。