
本文介绍如何使用正则表达式在pandas中识别并保留包含“数字+字母”组合的有效街道地址(如“4150 ute dr”),同时自动过滤掉纯文本地址(如“san diego county…”)和仅有邮编的地址(如“…92570”),确保地址字段具备实际门牌号特征。
本文介绍如何使用正则表达式在pandas中识别并保留包含“数字+字母”组合的有效街道地址(如“4150 ute dr”),同时自动过滤掉纯文本地址(如“san diego county…”)和仅有邮编的地址(如“…92570”),确保地址字段具备实际门牌号特征。
在地址清洗任务中,仅依赖“是否含数字”作为判断标准往往不够——因为邮编(如 92570)虽为数字,却不代表有效门牌号;而纯地名(如 San Diego County, California)则完全缺失结构化地址信息。真正需要保留的是体现“门牌号+街道名”结构的片段,典型模式为:连续数字(1–4位更合理)后紧跟空格与字母(如 4150 Ute、123 Main),这能有效区分真实地址与邮编或纯文本。
推荐使用以下正则表达式进行布尔索引筛选:
import pandas as pd
d = {'col1': ['San Diego County, California',
'4150 Ute Dr, San Diego, California',
'Vista del Lago, Perris, California, 92570'],
'col2': ['prov_1', 'prov_2', 'prov_3']}
df = pd.DataFrame(data=d)
# ✅ 推荐方案:匹配1–4位数字 + 可选空格 + 至少一个英文字母
filtered_df = df[df['col1'].str.contains(r'\d{1,4}\s*[a-zA-Z]+', na=False)]
print(filtered_df)
输出结果:
col1 col2 1 4150 Ute Dr, San Diego, California prov_2
✅ 为什么限定 \d{1,4}?
- 避免误匹配5位邮编(如 92570):\d{5} 会被排除;
- 覆盖常见门牌号长度(1 到 9999 均合理),过长数字(如 123456)大概率非门牌号;
- na=False 确保空值(NaN)不引发异常,统一视为 False。
⚠️ 注意事项:
- 若地址含国际格式(如带逗号分隔的 No. 45, Rue de Lyon),可扩展正则为 r'\b\d{1,4}\s*[a-zA-Z]'(\b 保证数字为独立词);
- str.extract() 适用于提取匹配片段而非过滤,如需生成新列标注门牌号,可用:
df['street_number'] = df['col1'].str.extract(r'(\d{1,4}\s*[a-zA-Z]+)', expand=False) - 实际业务中建议结合地理编码API二次校验,正则仅作初筛。
该方法简洁高效,无需循环或复杂逻辑,直接利用Pandas向量化字符串操作,兼顾准确性与性能,是地址质量预检的关键一步。











