在日常工作中,我们经常会遇到对比两个Excel表格中的差异,比如在员工考勤过程中找出没有签到的人员等等。最近就有这样一个问题:Excel表格“0012.xlsx”B列有1320姓名。有的姓名有重名,标题行在第一行,名称为“姓名”。“0015.xlsx”A列有1322个姓名。姓名有重复,没有标题行。两个表格有2600多个姓名,每个表格中都存在数据重复,使用Excel的vlookup或条件格式虽然可行,但对于大量数据处理起来并不高效。下面这段代码,虽然只有几行,但能有效快速找出差异。import pandas as pdpath1 = "0012.xlsx"path2 = "0015.xlsx"df1 = pd.read_excel(path1, header=0, usecols=[1])df2 = pd.read_excel(path2, header=None, usecols=[0])df2.columns = ["姓名"]n1 = df1["姓名"].astype(str).str.strip()n2 = df2["姓名"].astype(str).str.strip()name_set1 = set(n1)name_set2 = set(n2)only1 = name_set1 - name_set2only2 = name_set2 - name_set1if len(only1): print(f"仅在({path1})中有的姓名有{len(only1)}个,分别为{"、".join(only1)}")if len(only2): print(f"仅在({path2})中有的姓名有{len(only2)}个,分别为{"、".join(only2)}")
第6-8行:读取数据。header=0表示标题行在第一行,header=None表示将第一行作为数据,而非列名。usecols=[1]表示只读取第2列(从0开始计数列索引),usecols=[0]表示读取第1行。第10-11行:清洗数据,去除单元格的首发的空格。第13-14行:把姓名转换为集合。集合的最大特点是唯一性,不存在重复的元素。第16-17行:通过两个集合的差集,找出各自独有的姓名。第19-22行:显示结果。在这里只找到了仅在0015.xlsx有的两个姓名。下面的代码使用了collections模块,不仅找出了各自独有的姓名,还可以对两个表格中的姓名个数进行统计。import pandas as pdfrom collections import Counterpath1 = "0012.xlsx"path2 = "0015.xlsx"df1 = pd.read_excel(path1, header=0, usecols=[1])df2 = pd.read_excel(path2, header=None, usecols=[0])df2.columns = ["姓名"]n1 = df1["姓名"].astype(str).str.strip()n2 = df2["姓名"].astype(str).str.strip()name_count1 = Counter(df1["姓名"])name_count2 = Counter(df2["姓名"])print(f"文件 {path1} 中共有 {len(name_count1)} 个不同的姓名")print(f"文件 {path2} 中共有 {len(name_count2)} 个不同的姓名")print("="*50)# 找出在path2中但不在path1中的姓名print("在第二个文件但不在第一个文件中的姓名:")for name in name_count2: if name not in name_count1: print(f" {name} - 在{path2}中出现了{name_count2[name]}次")print("="*50)# 找出在path1中但不在path2中的姓名print("在第一个文件但不在第二个文件中的姓名:")for name in name_count1: if name not in name_count2: print(f" {name} - 在{path1}中出现了{name_count1[name]}次")print("="*50)common_names = set(name_count1.keys()) & set(name_count2.keys())print(f"两个文件共有的姓名数量:{len(common_names)}")
Counter中Python的内置计数工具,可以自动统计每个元素出现的次数,返回字典格式{姓名:出现次数}set(name_count1.keys()) & set(name_count2.keys())是两个集合的交集运算,可以找出两者都有的共同姓名。这两段代码不是简单地找不同,而是梳理数据背后的故事,如果你需要核对员工的考勤、会议的签到进行统计,并计算出实际到会率,找出缺席人员、未邀请却参会人员等等,可以快速帮你实现。