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
相关产品推荐
相关产品推荐

