You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 19:10:38