如何在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 1 | Address 2 |
|---|---|
| 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 |
尝试过的方法及问题
曾尝试从右侧按空格拆分,但部分城市名称包含两个单词(比如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
相关产品推荐
相关产品推荐

