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

Python使用recordlinkage去重DataFrame时not available值处理问题

问题根因

recordlinkage 内置的String、Exact等比对组件,对missing_value参数的默认判定逻辑为:若两条待比对记录的同字段值均等于指定的缺失标识,直接返回匹配分1。该逻辑默认将「双字段同时缺失」判定为强匹配特征,和需求中「双缺失计0分」的要求冲突,且组件本身没有提供参数直接修改该判定规则。

可行方案

不需要修改库源码,两种方案按需选择即可:

  • 后置修正法:保留原有全部比对配置,拿到初始得分矩阵后,单独把所有「同字段双缺失」的单元格得分强制置0,改造成本最低,适配绝大多数场景。
  • 自定义比较器法:给原有比对组件套一层前置校验,执行字符串/精确比对前先判断两个值是否均为缺失标识,是则直接返回0,否则走原有比对逻辑,适合字段多、需要批量复用规则的场景。
代码实现(后置修正法,成本最低)
import pandas as pd
import recordlinkage
from recordlinkage.compare import String, Exact

# 测试数据集
df = pd.DataFrame([
    {"name": "张三", "phone": "13800138000", "address": "北京市朝阳区"},
    {"name": "张三", "phone": "not available", "address": "not available"},
    {"name": "李四", "phone": "not available", "address": "not available"},
])

# 原有索引、比对规则完全保留
indexer = recordlinkage.BlockIndex(on='name')
candidate_pairs = indexer.index(df)

comparator = recordlinkage.Compare()
comparator.add(String('name', 'name', method='jarowinkler', missing_value='not available', label='name_score'))
comparator.add(Exact('phone', 'phone', missing_value='not available', label='phone_score'))
comparator.add(String('address', 'address', method='jarowinkler', missing_value='not available', label='address_score'))

# 拿到初始比对得分
score_result = comparator.compute(candidate_pairs, df)

# 核心修正:遍历字段将双缺失场景得分置0
compare_cols = ['name', 'phone', 'address']
for col in compare_cols:
    # 标记候选对中该字段双缺失的行
    left_is_missing = df.loc[candidate_pairs.get_level_values(0), col].values == 'not available'
    right_is_missing = df.loc[candidate_pairs.get_level_values(1), col].values == 'not available'
    both_missing_row = left_is_missing & right_is_missing
    # 对应得分强制设为0
    score_result.loc[both_missing_row, f'{col}_score'] = 0

结果验证:上述代码跑通后,两条同name、phone和address均为not available的记录,phone、address字段的比对得分均为0,其余非双缺失场景的比对计算逻辑完全不受影响,和预期结果一致。

内容的提问来源于stack exchange,提问作者waji

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 21:54:19