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

处理DataFrame邮政地址:移除国家/单元号及报错解决

处理Geopy解析地址的清洗问题

我有一个包含邮政地址列的DataFrame,地址由geopy.geocoders.GoogleV3解析生成,但输出里包含不需要的国家名和单元号。需要最终保留街道号、街道名、城市、州和邮政编码。

测试数据集里用两种方法能正常运行,但处理15万条数据的大型DataFrame时,抛出错误:AttributeError: 'float' object has no attribute 'split'。

尝试过的代码

方法1:截取字符串移除国家名

test_add['clean address'] = test_add.apply(lambda x: x['clean address'][:-5], axis = 1)

方法2:移除带#的单元号

def remove_units(X):
    X = X.split()
    X_new = [x for x in X if not x.startswith("#")]
    return ' '.join(X_new)

test_add['parsed addresses'] = test_add['clean address'].apply(remove_units)

测试数据集

data = ["941 Thorpe St, Rock Springs, WY 82901, USA",
    "2809 Harris Dr, Antioch, CA 94509, USA",
    "7 Eucalyptus, Newport Coast, CA 92657, USA",
    "725 Mountain View St, Altadena, CA 91001, USA",
    "1966 Clinton Ave #234, Calexico, CA 92231, USA",
    "431 6th St, West Sacramento, CA 95605, USA",
    "5574 Old Goodrich Rd, Clarence, NY 14031, USA",
    "Valencia Way #1234, Valley Center, CA 92082, USA"]
test_df = pd.DataFrame(data, columns=['parsed addresses'])

错误原因

报错核心是DataFrame中存在空值(NaN),NaN在Pandas里以float类型存储,调用字符串方法(如split()、切片)时自然会触发属性错误。测试数据集没有空值所以正常,但大型数据集里难免有Geopy解析失败的空地址。

解决方案

1. 先处理空值

先过滤或填充空地址,避免后续操作报错:

# 方案A:直接删除空值行
df = df.dropna(subset=['parsed addresses'])

# 方案B:填充空值为空白字符串
df['parsed addresses'] = df['parsed addresses'].fillna('')

2. 安全移除国家名

不要用固定长度切片(比如[:-5]),因为可能存在非"USA"的国家名或格式变异地址,按逗号分割取前3部分更稳妥:

df['clean address'] = df['parsed addresses'].apply(
    lambda x: ', '.join(x.split(',')[:3]).strip() if isinstance(x, str) and x else ''
)

3. 安全移除单元号

修改函数,先判断输入是否为有效字符串:

def remove_units(address):
    if not isinstance(address, str) or not address:
        return ''
    parts = address.split()
    cleaned_parts = [part for part in parts if not part.startswith('#')]
    return ' '.join(cleaned_parts)

df['final address'] = df['clean address'].apply(remove_units)

4. 合并优化版(适合大数据量)

把两步合并成一个函数,同时用Pandas矢量化方法提升处理速度:

def clean_address(address):
    if not isinstance(address, str) or not address:
        return ''
    # 移除国家名
    without_country = ', '.join(address.split(',')[:3]).strip()
    # 移除单元号
    parts = without_country.split()
    return ' '.join([p for p in parts if not p.startswith('#')])

# 或者用矢量化操作代替apply,效率更高
df['final address'] = df['parsed addresses'].fillna('').str.split(',').str[:3].str.join(', ').str.strip()
df['final address'] = df['final address'].str.split().apply(
    lambda x: ' '.join([p for p in x if not p.startswith('#')]) if x else ''
)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 00:06:28