如何用Python匹配两个Excel文件中的姓名并返回匹配百分比
Python实现跨Excel姓名匹配及相似度计算
需求说明
你有两个仅含姓名单列的Excel文件,内容如下:
File 1: file1.xlsx
Names Vinay adkz Sagarbhansali Jeffery Jonas Kiara Francis Dominic
File 2: file2.xlsx
Names: bhansali Sagar Dominic Jenny adkzVinay
需要将file1中的姓名与file2中的姓名匹配,输出包含原姓名、匹配到的file2姓名、匹配百分比的结果,示例输出如下:
Names File2Matchname Match% Vinay adkz adkzVinay 98% Sagarbhansali bhansali sagar 97% Jeffery Jonas NA 0% Kiara Francis NA 0% Dominic Dominic 100%
实现方案
完全可以用Python实现,核心是用余弦相似度衡量姓名文本的相似性,结合pandas读取Excel、sklearn计算相似度完成需求。
核心逻辑:余弦相似度
余弦相似度通过计算两个文本向量的夹角余弦值衡量相似性,值越接近1表示文本越相似。这里我们把每个姓名转换成字符级词频向量(统计每个字符的出现次数),再计算向量间的余弦相似度,以此判断姓名匹配度。
完整代码
import pandas as pd from sklearn.feature_extraction.text import CountVectorizer from sklearn.metrics.pairwise import cosine_similarity import numpy as np # 1. 读取Excel文件,统一列名 df1 = pd.read_excel("file1.xlsx") df2 = pd.read_excel("file2.xlsx") df2.columns = ["Names"] # 修正file2的列名 # 2. 姓名预处理:去除首尾空格、转小写,消除格式干扰 def preprocess_name(name): return str(name).strip().lower() df1["Cleaned_Name"] = df1["Names"].apply(preprocess_name) df2["Cleaned_Name"] = df2["Names"].apply(preprocess_name) # 3. 生成字符级向量表示 vectorizer = CountVectorizer(analyzer="char") all_names = pd.concat([df1["Cleaned_Name"], df2["Cleaned_Name"]]) vectorizer.fit(all_names) # 转换为向量矩阵 vec1 = vectorizer.transform(df1["Cleaned_Name"]) vec2 = vectorizer.transform(df2["Cleaned_Name"]) # 4. 计算每个file1姓名的最佳匹配 matches = [] match_percents = [] for vec in vec1: # 计算当前姓名与file2所有姓名的相似度 sim_scores = cosine_similarity(vec, vec2)[0] max_sim_idx = np.argmax(sim_scores) max_sim = sim_scores[max_sim_idx] # 设置相似度阈值,低于阈值视为无匹配 if max_sim >= 0.8: matches.append(df2["Names"].iloc[max_sim_idx]) match_percents.append(f"{round(max_sim * 100)}%") else: matches.append("NA") match_percents.append("0%") # 5. 构建结果并输出 result = pd.DataFrame({ "Names": df1["Names"], "File2Matchname": matches, "Match%": match_percents }) # 打印结果并保存为Excel print(result.to_string(index=False)) result.to_excel("name_matches.xlsx", index=False)
代码说明
- 预处理步骤统一姓名格式,避免大小写、首尾空格影响匹配精度;
- 字符级向量转换能精准捕捉姓名字符的重合情况,适配姓名顺序颠倒、连写拆分等场景;
- 通过阈值过滤低相似性结果,减少误匹配;
- 最终结果可直接打印或保存为Excel文件,符合需求格式。
内容的提问来源于stack exchange,提问作者Sasi
相关产品推荐
相关产品推荐

