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

如何使用Python对DataFrame两列数据实现部分名称匹配比对

两种实现部分匹配的方案

方案1:子串包含匹配

适用于两份名单名称差异仅为前后缀补充、核心名称完全一致的场景,比如濒危名单名称为「达氏鲟」,自有名单名称为「达氏鲟(成体)」。
代码如下:

import pandas as pd

# 原有读取、重命名逻辑可保留
d1 = pd.read_csv('endangered-fish.csv')
d2 = pd.read_csv('fish.csv')
d1.rename(columns={'Common Name': 'common_name'}, inplace=True)
d2.rename(columns={'name': 'ac_name'}, inplace=True)

# 可选:统一转为小写,避免大小写差异导致匹配失败
# d1['common_name'] = d1['common_name'].str.lower()
# d2['ac_name'] = d2['ac_name'].str.lower()

# 标记自有物种是否在濒危名单中存在部分匹配
d2['is_endangered'] = d2['ac_name'].apply(
    lambda x: d1['common_name'].str.contains(x, na=False).any()
)

# 如需获取匹配到的具体濒危物种名称,可使用下方逻辑
def get_matched_name(ac_name):
    matched = d1[d1['common_name'].str.contains(ac_name, na=False)]['common_name']
    return '、'.join(matched.tolist()) if len(matched) > 0 else ''

d2['matched_endangered_name'] = d2['ac_name'].apply(get_matched_name)

# 导出结果、统计匹配数量
d2.to_csv('fish_endangered_check_result.csv', index=False)
print(d2['is_endangered'].value_counts())

方案2:模糊相似度匹配

适用于名称存在拼写误差、语序调整、缩写差异的场景,比如濒危名单名称为「中华白海豚」,自有名单名称为「白海豚(中华)」。
首先安装依赖库:
pip install fuzzywuzzy python-Levenshtein

匹配代码如下:

from fuzzywuzzy import fuzz
import pandas as pd

# 原有读取、重命名逻辑可保留
d1 = pd.read_csv('endangered-fish.csv')
d2 = pd.read_csv('fish.csv')
d1.rename(columns={'Common Name': 'common_name'}, inplace=True)
d2.rename(columns={'name': 'ac_name'}, inplace=True)

# 匹配相似度阈值,范围0-100,数值越高匹配越严格,可根据测试结果调整
SIMILARITY_THRESHOLD = 70

def fuzzy_match(ac_name):
    max_score = 0
    matched_name = ''
    for endan_name in d1['common_name'].dropna():
        # token_set_ratio不受词序、重复词影响,适配别名类匹配场景
        score = fuzz.token_set_ratio(ac_name, endan_name)
        if score > max_score and score >= SIMILARITY_THRESHOLD:
            max_score = score
            matched_name = endan_name
    return pd.Series([max_score >= SIMILARITY_THRESHOLD, matched_name, max_score])

# 新增匹配结果列
d2[['is_endangered', 'matched_endangered_name', 'match_score']] = d2['ac_name'].apply(fuzzy_match)

# 导出结果、统计匹配数量
d2.to_csv('fish_fuzzy_match_result.csv', index=False)
print(d2['is_endangered'].value_counts())

注意事项

  • 数据量超过1万行时,模糊匹配速度较慢,可先做名称预处理(去除特殊字符、多余空格、统一大小写)减少计算量,或引入多进程加速。
  • 相似度阈值可根据实际匹配效果调整:漏匹配多则降低阈值,误匹配多则升高阈值。

内容的提问来源于stack exchange,提问作者user12755836

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 17:45:05