如何在Pandas中使用正则表达式拆分字符串类型的地址列
拆分可变格式的地址DataFrame列
嘿,这个地址拆分的问题我之前也碰到过,关键是抓住地址的结构规律——不管街道名称有没有空格,最后三个部分都是独立的非空白元素(数字或字母)。下面给你一个靠谱的解决方案:
第一步:构造示例数据
先把你的测试DataFrame搭起来,我还加了第二种门牌号是数字的情况,方便验证:
import pandas as pd import numpy as np df = pd.DataFrame(index=np.arange(10)) # 混合两种地址格式 df["address"] = ["Iso Omena 8 a 2"]*5 + ["Iso Omena 8 5 2"]*5
第二步:用正则表达式提取拆分
我们用pandas的str.extract()方法,配合一个贪婪模式的正则,精准匹配街道名称和后面三个独立元素:
# 正则解析:捕获街道名称(所有内容直到最后三个元素),然后三个独立的非空白元素 address_pattern = r'^(.*)\s+(\S+)\s+(\S+)\s+(\S+)$' # 提取并直接生成新列 df[["street_name", "building_number", "door_number_letter", "apartment_number"]] = df["address"].str.extract(address_pattern)
正则表达式解释
这个正则能完美适配你的两种场景,各部分含义:
^(.*)\s+:贪婪匹配开头到倒数第四个元素前的所有内容,这样不管街道名称有多少个空格,都能完整抓出来(\S+):匹配连续的非空白字符,正好对应建筑编号、门牌号/字母、公寓号(不管是数字还是字母都能匹配)$:锚定字符串结尾,确保我们解析的是完整的地址
最终结果
运行后你的DataFrame会变成这样(截取部分行):
| index | address | street_name | building_number | door_number_letter | apartment_number |
|---|---|---|---|---|---|
| 0 | Iso Omena 8 a 2 | Iso Omena | 8 | a | 2 |
| 5 | Iso Omena 8 5 2 | Iso Omena | 8 | 5 | 2 |
如果之后遇到更复杂的地址变种(比如街道名称后面有更多元素),只需要微调正则里的捕获组数量就行,目前这个方案完全覆盖你提到的两个难点~
内容的提问来源于stack exchange,提问作者chessosapiens
相关产品推荐
相关产品推荐

