如何对比Pandas两列地址字段 判断是否包含相同数字或数字集合
解决方案
你当前的实现问题出在使用str.extract仅能提取每段地址中第一个匹配到的数字,无法覆盖所有数字匹配的场景。可以通过提取所有数字转为集合、判断集合交集的方案实现需求,具体实现如下:
完整代码
import pandas as pd import numpy as np # 初始化原始数据集 data = [['Road 76', 'Road 12, 55'], ['Road 11, 7-9', 'Road 11, 5'], ['Road 25', 'Street 5']] df_original = pd.DataFrame(data, columns = ['Address 1', 'Address 2']) # 分别提取两列地址的所有数字,转为集合格式 addr1_num_set = df_original['Address 1'].str.findall(r'\d+').apply(set) addr2_num_set = df_original['Address 2'].str.findall(r'\d+').apply(set) # 判断两个集合是否存在交集,生成匹配结果列 df_original['Number Match?'] = np.where(addr1_num_set & addr2_num_set, 1, 0) # 查看结果 print(df_original)
逻辑说明
str.findall(r'\d+')会提取字符串中所有连续的数字序列,返回列表格式,不会遗漏任何数字(包括7-9这类格式中拆分出来的7、9两个数字)- 用
apply(set)将数字列表转为集合后,直接通过集合交集运算符&判断两列是否存在公共数字,空集判定为不匹配,非空集判定为匹配,刚好对应0和1的结果要求 - 该方案不会修改原始的地址列内容,避免覆盖原始数据
内容的提问来源于stack exchange,提问作者Filippo Sebastio
相关产品推荐
相关产品推荐

