当前位置:首页>python>重复数据再多也不怕!Python一键对比两张Excel指定列,差异自动标黄,准确率100%!

重复数据再多也不怕!Python一键对比两张Excel指定列,差异自动标黄,准确率100%!

  • 2026-09-07 05:34:18
重复数据再多也不怕!Python一键对比两张Excel指定列,差异自动标黄,准确率100%!
先来看这个实际问题:
做过财务、统计、对账的朋友,一定遇过这样的问题:两张Excel工作表,里面有的是重复行,要找出指定列,如收据号+金额的差异在哪里。有的重复行还不止一次,Vlookup也不好用,条件格式也用不上,辅助列也不好使。
有没有一种方法,像数苹果一样,你这边有3个,我这边有2个, 立刻能把多出来的那个找出来?
当然可以。今天的分享只需50代码就能轻松搞定,不管你的重复行有多少,都能帮你搞定,还能一键标注为黄色。
常规的去重或查找功能,通过基于唯一值来实现,但是在实际业务中,重复却代表着业务的多次发生。
比如:
A表:收据号为0017803,出现3次,金额4000元,出现2次,22800元出现1次。
B表:收据号为0017803,出现2次,金额4000元,出现1次,22800元出现1次。
这就意味着表A比表B多了一条记录业务,或表B少了一条记录。
我们的目标不是把它们作为一行来处理,而是根据出现的次数找出差异,多出来的部分,统一标注为黄色。
直接上代码,大家可以直接复制修改就能用。
import pandas as pdfrom openpyxl import load_workbookfrom openpyxl.styles import PatternFillfrom collections import Counterf1 = r"D:\示例\票据发票找差异\24年收据明细表.xlsx"f2 = r"D:\示例\票据发票找差异\24年自然月课题收入.xlsx"shouju_col = "收据号"shijiao_col = "实交金额"yellow_fill = PatternFill(start_color="FFFF99", end_color="FFFF99", fill_type="solid")df1 = pd.read_excel(f1, dtype=str).dropna(subset=shouju_col)df2 = pd.read_excel(f2, dtype=str).dropna(subset=shouju_col)key1 = df1[shouju_col].str.strip() + "|" + df1[shijiao_col].str.strip() + "|" + df1[yingjiao_col].str.strip()key2 = df2[shouju_col].str.strip() + "|" + df2[shijiao_col].str.strip() + "|" + df2[yingjiao_col].str.strip()count1 = Counter(key1)count2 = Counter(key2)# 找出差异行标号def get_marked_rows(keys, other_count):    marked = []    current = Counter()    for idx, key in enumerate(keys):        current[key] += 1        # 只要当前行的出现次数 > 对方表格的次数,就标黄        if current[key] > other_count.get(key, 0):            marked.append(idx + 2)  # Excel行从第2行开始    return markedmarked1 = get_marked_rows(key1, count2)  # 表1对比表2的次数marked2 = get_marked_rows(key2, count1)  # 表2对比表1的次数# 标黄并保存文件def mark_excel(file_path, rows):    if not rows:        print(f"\n{file_path} 无多余行")        return    wb = load_workbook(file_path)    ws = wb.active    for r in rows:        for col in range(1, ws.max_column + 1):            ws.cell(row=r, column=col).fill = yellow_fill    save_path = file_path.replace(".xlsx", "_对比结果.xlsx")    wb.save(save_path)mark_excel(f1, marked1)mark_excel(f2, marked2)print("对比完成:")print(f"{f1.split('\\')[-1]} 标黄:{len(marked1)} 行")print(f"{f2.split('\\')[-1]} 标黄:{len(marked2)} 行")
这段代码的思路很简单,就是把“收据号”和“实交金额”拼接成一个组合键,然后再统计每张表里每个组合键出现的次数,超出对方出现次数的行就标黄。这样不管表里有多少重复行,都能精准地找出多出来的那几行。
在这里重点说几个细节:
df1 = pd.read_excel(f1, dtype=str).dropna(subset=shouju_col)
dtype=str:强制读取为字符串,防止因文本型和数值型格式不一致而出现错误。
.dropna(subset=shouju_col):删除指定列“收据号”的空白行。
current[key] += 1
在这里使用的是Counter计数法处理重复行,不是简单的“有”或“无”,而是出现的次数。
marked.append(idx + 2)
Pandas读取数据索引是从0开始,第1行是标题行,加2才能对应到Excel的实际行号。
save_path = file_path.replace(".xlsx","_对比结果.xlsx")
在这里重新构建新的文件路径,防止原文件被覆盖。运行代码,你会得到两个新的Excel文件,结尾为“_对比结果.xlsx”。
如果你在账务对账、票据核对、数据汇总过程中也经常遇到类似的问题,这段代码建议你收藏+转发,下次遇到重复行找差异,直接拿来就用,再也不用为数据对不上而熬夜加班了~~~

最新文章

随机文章