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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 04:16:33