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

如何在Pandas中拆分含转义换行符的地址列并补全字段

Pandas拆分地址列并填充对应字段

问题描述

现有如下Pandas数据集:

import pandas as pd

data = {'id':  ['001', '002', '003','004'],
        'address': ["William J. Clare\n290 Valley Dr.\nCasper, WY 82604\nUSA",
                    "1180 Shelard Tower\nMinneapolis, MN 55426\nUSA",
                    "William N. Barnard\n145 S. Durbin\nCasper, WY 82601\nUSA",
                    "215 S 11th ST"],
        'locality': [None, None, None,'Laramie'],
        'region': [None, None, None, 'WY'],
        'Zipcode': [None, None, None, '87656'],
        'Country': [None, None, None, 'US']
        }

df = pd.DataFrame(data)

地址列包含转义换行符\n,需要拆分该列,将拆分出的信息填充到locality、region、Zipcode、Country字段中,同时保留这些字段已有的非空值,最终得到如下格式的结果:

id  address           locality    region  Zipcode Country
001 290 Valley Dr.    Casper      WY      82604   USA
002 1180 Shelard Tower Minneapolis MN      55426   USA
003 145 S. Durbin     Casper      WY      82601   USA
004 215 S 11th ST     Laramie     WY      87656   US

要求结果保留在Pandas DataFrame中用于后续分析。

解决方案

1. 筛选需拆分的行

先定位locality为空的行,这类行需要从address中提取信息:

mask = df['locality'].isna()
split_df = df[mask].copy()

2. 拆分地址并提取各字段

对address列按\n拆分,逐一提取街道地址、地区、邮编、国家信息:

# 拆分地址为多列
split_address = split_df['address'].str.split('\n', expand=True)

# 更新address列为街道地址(拆分后的第2个元素)
split_df['address'] = split_address[1]

# 处理包含城市、州、邮编的行
region_info = split_address[2].str.split(', ', expand=True)
split_df['locality'] = region_info[0]

# 拆分州和邮编
region_zip = region_info[1].str.split(' ', expand=True)
split_df['region'] = region_zip[0]
split_df['Zipcode'] = region_zip[1]

# 提取国家信息
split_df['Country'] = split_address[3]

3. 合并结果

将处理后的行与原DataFrame中无需拆分的行合并,恢复原索引顺序:

result_df = pd.concat([split_df, df[~mask]]).sort_index()

完整代码

import pandas as pd

data = {'id':  ['001', '002', '003','004'],
        'address': ["William J. Clare\n290 Valley Dr.\nCasper, WY 82604\nUSA",
                    "1180 Shelard Tower\nMinneapolis, MN 55426\nUSA",
                    "William N. Barnard\n145 S. Durbin\nCasper, WY 82601\nUSA",
                    "215 S 11th ST"],
        'locality': [None, None, None,'Laramie'],
        'region': [None, None, None, 'WY'],
        'Zipcode': [None, None, None, '87656'],
        'Country': [None, None, None, 'US']
        }

df = pd.DataFrame(data)

# 筛选需拆分的行
mask = df['locality'].isna()
split_df = df[mask].copy()

# 拆分地址并提取字段
split_address = split_df['address'].str.split('\n', expand=True)
split_df['address'] = split_address[1]

region_info = split_address[2].str.split(', ', expand=True)
split_df['locality'] = region_info[0]

region_zip = region_info[1].str.split(' ', expand=True)
split_df['region'] = region_zip[0]
split_df['Zipcode'] = region_zip[1]

split_df['Country'] = split_address[3]

# 合并最终结果
result_df = pd.concat([split_df, df[~mask]]).sort_index()

# 查看结果
print(result_df)

运行结果

id               address     locality region Zipcode Country
0  001        290 Valley Dr.        Casper     WY   82604     USA
1  002  1180 Shelard Tower  Minneapolis     MN   55426     USA
2  003       145 S. Durbin        Casper     WY   82601     USA
3  004       215 S 11th ST       Laramie     WY   87656      US

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 10:45:43