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

如何在Pandas数据框中拆分无逗号、格式不规则的地址?

拆分Pandas地址列:区分街道与城市州邮编

原始地址数据(Pandas数据框的Address列):

Address
287 Andover Pl Robbinsville NJ 08691
1 Oxford Ct Princeton Jct NJ 08550
244 N Post Rd Princeton Jct NJ 08550
3 Gates Ct West Windsor NJ 08550

需要拆分为两列,格式如下:

Address 1Address 2
287 Andover PlRobbinsville NJ 08691
1 Oxford CtPrinceton Jct NJ 08550
244 N Post RdPrinceton Jct NJ 08550
3 Gates CtWest Windsor NJ 08550

尝试过的方法及问题

曾尝试从右侧按空格拆分,但部分城市名称包含两个单词(比如West Windsor),导致拆分逻辑失效。尝试代码如下:

# 分离邮编到单独列
clean_df[['prop_addressLine1','Owner Zip']] = clean_df['Owner Address'].str.rsplit(' ', n=1, expand=True)

# 拆分街道、城市、州到各自列
clean_df[['Owner Street','Owner City','Owner State']] = clean_df['prop_addressLine1'].str.rsplit(' ', n=2, expand=True)

也曾考虑按空格拆分到多列,但存在不规则空格的问题,未找到可行方案。

解决方案

针对美国地址的特点(州缩写为2位大写字母,邮编为5位数字),可以利用正则表达式匹配或反向定位实现精准拆分:

方法1:正则捕获组拆分

通过正则匹配出「街道部分」「城市」「州」「邮编」,再将城市、州、邮编合并为目标列:

import pandas as pd

# 构造示例数据
data = {
    'Address': [
        '287 Andover Pl Robbinsville NJ 08691',
        '1 Oxford Ct Princeton Jct NJ 08550',
        '244 N Post Rd Princeton Jct NJ 08550',
        '3 Gates Ct West Windsor NJ 08550'
    ]
}
df = pd.DataFrame(data)

# 正则匹配拆分各部分
pattern = r'^(.*?)\s+([A-Za-z\s]+)\s+([A-Z]{2})\s+(\d{5})$'
df[['Address1', 'City', 'State', 'Zip']] = df['Address'].str.extract(pattern)

# 合并城市、州、邮编为Address2
df['Address2'] = df[['City', 'State', 'Zip']].agg(' '.join, axis=1)

# 保留目标列
result_df = df[['Address1', 'Address2']]
print(result_df)

输出结果:

Address1                  Address2
0  287 Andover Pl    Robbinsville NJ 08691
1    1 Oxford Ct  Princeton Jct NJ 08550
2  244 N Post Rd  Princeton Jct NJ 08550
3    3 Gates Ct    West Windsor NJ 08550

方法2:反向定位拆分

先定位邮编位置,再反向找到州缩写的边界,以此拆分地址:

import pandas as pd

# 构造示例数据
data = {
    'Address': [
        '287 Andover Pl Robbinsville NJ 08691',
        '1 Oxford Ct Princeton Jct NJ 08550',
        '244 N Post Rd Princeton Jct NJ 08550',
        '3 Gates Ct West Windsor NJ 08550'
    ]
}
df = pd.DataFrame(data)

# 提取邮编并定位州缩写的结束位置
df['Zip'] = df['Address'].str.extract(r'(\d{5})$')
df['state_end_idx'] = df['Address'].str.rfind(' ', 0, df['Address'].str.rfind(' '))

# 拆分Address1和Address2
df['Address1'] = df.apply(lambda x: x['Address'][:x['state_end_idx']].strip(), axis=1)
df['Address2'] = df.apply(lambda x: x['Address'][x['state_end_idx']:].strip(), axis=1)

# 清理临时列并输出结果
result_df = df[['Address1', 'Address2']]
print(result_df)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 12:37:18