如何对Pandas DataFrame列逐行执行scourgify地址标准化并追加结果
解决方案
首先安装所需依赖:
pip install pandas scourgify
完整处理代码如下:
import pandas as pd from scourgify import normalize_address_record # 构造模拟数据集 data = [['a', '123 southwest Main street, Boring, or, 97203'], ['b', '4285 balsam la n plymouth mn 55441'], ['c', '632 bloomington ave s minneapolis mn 55417']] df = pd.DataFrame(data, columns = ['id', 'address_original']) # 定义地址标准化函数,增加异常处理避免个别地址解析失败中断全量流程 def normalize_addr(addr_str): try: return normalize_address_record(addr_str) except: # 解析失败的地址返回空字段,可根据需求调整返回规则 return { 'address_line_1': '', 'address_line_2': '', 'city': '', 'state': '', 'postal_code': '' } # 批量处理地址列,将返回的字典结构转为表格结构 normalized_df = df['address_original'].apply(normalize_addr).apply(pd.Series) # 拼接原始表和标准化后的字段 df = pd.concat([df, normalized_df], axis=1)
处理后最终的DataFrame样例如下:
| id | address_original | address_line_1 | address_line_2 | city | state | postal_code |
|---|---|---|---|---|---|---|
| a | 123 southwest Main street, Boring, or, 97203 | 123 SW MAIN ST | BORING | OR | 97203 | |
| b | 4285 balsam la n plymouth mn 55441 | 4285 BALSAM LN N | PLYMOUTH | MN | 55441 | |
| c | 632 bloomington ave s minneapolis mn 55417 | 632 BLOOMINGTON AVE S | MINNEAPOLIS | MN | 55417 |
关键逻辑说明
apply方法对应你熟悉的R语言中apply/purrr::map系列函数的功能,可以对整列的每一行值批量执行操作- 异常处理为可选配置,建议保留,实际业务中存在大量格式不规范的地址可能触发scourgify的解析错误
pd.concat可以直接按行索引对齐拼接原始表和标准化后的字段,无需额外做匹配操作
内容的提问来源于stack exchange,提问作者TDP
相关产品推荐
相关产品推荐

