如何使用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
相关产品推荐
相关产品推荐

