如何在fuzzywuzzy模糊匹配后将dataframe的None替换为最常见姓名
模糊匹配未命中结果替换为最高频姓名解决方案
首先明确:fuzzywuzzy的process.extractOne未匹配到符合阈值的结果时会返回None,你之前写的df1.max(axis = 1)代码并不适用于当前需求,因为你需要的是用全数据集固定的最高频姓名替换所有未匹配项,而非取每行的最大值。
步骤1:计算待匹配列出现频率最高的姓名
首先统计df2中NICKNAME列的最高频值:
# 取出现频率最高的昵称,存在多个并列最高频时会返回第一个出现的 most_freq_nickname = df2['NICKNAME'].value_counts().idxmax()
步骤2:替换未匹配的None值
两种实现方式可选:
方式一:生成匹配列时直接替换(推荐,无需二次遍历)
提前预存昵称列表和最高频值,在调用apply时直接做判断:
from fuzzywuzzy import process import pandas as pd nickname_list = df2['NICKNAME'].tolist() most_freq_nickname = df2['NICKNAME'].value_counts().idxmax() df1['Matched_Nickname_and_Score'] = df1['FNAME'].apply( lambda x: process.extractOne(x, nickname_list, score_cutoff=75) or (most_freq_nickname, 0) )
这里用or逻辑判断,当extractOne返回None(布尔值为False)时,会自动取后面的默认值,你可以根据需要调整默认分数0的取值。
方式二:已生成匹配列后二次替换
如果已经执行完原匹配代码得到了带None的列,直接调用fillna替换即可:
most_freq_nickname = df2['NICKNAME'].value_counts().idxmax() df1['Matched_Nickname_and_Score'] = df1['Matched_Nickname_and_Score'].fillna( value=(most_freq_nickname, 0) )
可选操作:拆分匹配结果为独立列
如果需要单独使用匹配到的昵称和分数,可以拆分存储为两列更方便后续处理:
df1[['Matched_Nickname', 'Match_Score']] = pd.DataFrame( df1['Matched_Nickname_and_Score'].tolist(), index=df1.index )
内容的提问来源于stack exchange,提问作者user13150405
相关产品推荐
相关产品推荐

