使用Fuzzywuzzy实现两个DataFrame地址模糊匹配并拷贝唯一键
基于地址模糊匹配的两个DataFrame关联方案
错误原因
你之前的合并逻辑错误核心是混淆了匹配结果的索引归属:process.extractOne返回的第三个元素是df1中匹配行的索引,你把这个值设为df1的索引后按行索引和df2合并,本质是把df1的行顺序打乱成和df2匹配结果的索引一致再直接按行对齐,完全不符合关联逻辑,才会出现匹配错位的问题。
正确实现代码
import pandas as pd from fuzzywuzzy import process THRESHOLD = 90 # 原有匹配逻辑保持不变 best_match = df2['address_df2'].apply( lambda x: process.extractOne(x, df1['address_df1'], score_cutoff=THRESHOLD) ) # 拆分匹配结果为独立列追加到df2 match_result = best_match.apply(pd.Series) match_result.columns = ['matched_df1_address', 'fuzzy_match_%', 'df1_matched_index'] df2 = pd.concat([df2, match_result], axis=1) # 用匹配到的df1索引提取唯一键,空匹配场景做兼容 df2['unique key(from df1)'] = df2['df1_matched_index'].apply( lambda idx: df1.loc[idx, 'unique key'] if pd.notna(idx) else None ) # 整理为要求的输出格式 df3 = df2[['cost center', 'country', 'address_df2', 'unique key(from df1)', 'fuzzy_match_%']].copy() # 相似度转为带%的字符串格式 df3['fuzzy_match_%'] = df3['fuzzy_match_%'].astype(str) + '%'
扩展说明
如果需要关联df1的更多字段(比如call #、Name等),可以直接用join方法批量关联,不需要逐个字段提取:
df3 = df2.join( df1.drop(columns=['address_df1']), # 避免地址列重复 on='df1_matched_index' )
内容的提问来源于stack exchange,提问作者aero8991
相关产品推荐
相关产品推荐

