如何使用Levenshtein算法更新DataFrame的m_name列以替换空值?
使用Levenshtein算法填充DataFrame中m_name列的空值
没问题,咱们来搞定这个用Levenshtein算法填充空值的需求。核心思路是:先从已有数据里提取m_name不为空的有效样本作为匹配模板,然后对每个m_name为空的行,计算它的original_name和模板中所有original_name的编辑距离,找到最相似的那个,把对应的m_name值填进去。
准备工作
首先得装好需要的工具:
- 用
pandas处理DataFrame - 用
python-Levenshtein库计算编辑距离(没装的话先跑pip install python-Levenshtein)
完整代码示例
1. 构造示例DataFrame
import pandas as pd from Levenshtein import distance # 还原你的示例数据 data = { 'original_name': ['New York', 'new york', 'New York city', 'california', 'California,000IU...', 'Californiya'], 'm_name': ['New York', None, None, 'California', None, 'California'], 'created': ['2017-08-01 09:33:40', '2017-08-01 15:15:06', '2017-08-01 15:15:06', '2017-09-01 09:33:40', '2017-09-01 01:40:00', '2017-09-01 11:38:00'] } df = pd.DataFrame(data)
2. 提取匹配候选集
先把m_name非空的行单独拎出来,作为我们的匹配模板:
match_candidates = df[df['m_name'].notna()][['original_name', 'm_name']].reset_index(drop=True)
3. 定义填充函数并应用
写一个函数,专门给空值行找最匹配的m_name:
def fill_missing_mname(original_name): # 统一转小写,避免大小写差异干扰匹配结果 target_name = original_name.lower() # 计算当前名称和所有候选名称的编辑距离(数值越小越相似) distances = [distance(target_name, cand.lower()) for cand in match_candidates['original_name']] # 找到距离最小的候选对应的m_name min_idx = distances.index(min(distances)) return match_candidates.loc[min_idx, 'm_name'] # 对m_name为空的行应用填充逻辑 df['m_name'] = df.apply( lambda row: fill_missing_mname(row['original_name']) if pd.isna(row['m_name']) else row['m_name'], axis=1 )
优化建议
如果担心出现错误匹配,可以加个距离阈值:只有当最小编辑距离小于设定值(比如3)时才填充,否则保留空值。修改后的函数如下:
def fill_missing_mname(original_name, threshold=3): target_name = original_name.lower() distances = [distance(target_name, cand.lower()) for cand in match_candidates['original_name']] min_dist = min(distances) if min_dist <= threshold: min_idx = distances.index(min_dist) return match_candidates.loc[min_idx, 'm_name'] else: return None # 超过阈值不强制填充
最终效果
运行完代码后,你的DataFrame会变成这样:
original_name m_name created 0 New York New York 2017-08-01 09:33:40 1 new york New York 2017-08-01 15:15:06 2 New York city New York 2017-08-01 15:15:06 3 california California 2017-09-01 09:33:40 4 California,000IU... California 2017-09-01 01:40:00 5 Californiya California 2017-09-01 11:38:00
内容的提问来源于stack exchange,提问作者bboy
相关产品推荐
相关产品推荐

