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

如何解决geopy读取DataFrame中地址失败的问题?

问题诊断与修复方案

你遇到的问题其实是两个容易忽略的细节导致的,咱们一步步拆解解决:

1. DataFrame列名未正确初始化

你创建DataFrame时直接传入了完整的results列表,这会把第一行的列名也当成了普通数据行,最终DataFrame的列名默认变成了0、1、2。此时df['location_raw']根本不是一个存在的列,自然无法获取到地址字符串,直接触发了异常分支。

正确的做法是把results的第一个元素作为列名,剩余元素作为数据行:

df = pd.DataFrame(results[1:], columns=results[0])

2. 循环中错误地整列赋值

原代码里df['location_lat_lng'] = location.raw会把整个列的所有行都覆盖成当前循环的结果,这完全不是你想要的单行赋值逻辑。应该用df.loc定位到当前行的指定列进行赋值:

df.loc[x, 'location_lat_lng'] = location.raw

(异常分支里的赋值也要改成同样的单行逻辑)

修正后的完整代码

import pandas as pd
results = [['city', 'state', 'location_raw'], ['Juneau', 'AK', """3260 HOSPITAL DR JUNEAU 99801"""], ['Palmer', 'AK', """2500 SOUTH WOODWORTH LOOP PALMER 99645"""], ['Anchorage', 'AK', """3200 PROVIDENCE DRIVE ANCHORAGE 99508"""]]

# 正确设置列名和数据行
df = pd.DataFrame(results[1:], columns=results[0])
print(type(df))

from geopy.geocoders import Nominatim
geolocator = Nominatim(user_agent="ryan_app")

# 提前创建目标列,避免循环中新增列的警告
df['location_lat_lng'] = None

for x in range(len(df.index)):
    try:
        # 现在可以正确获取到每行的location_raw值了
        location = geolocator.geocode(df['location_raw'].iloc[x])
        print(location.raw)
        # 给当前行的指定列赋值
        df.loc[x, 'location_lat_lng'] = location.raw
    except Exception as e:
        # 捕获具体异常方便调试,同时给当前行赋值
        print(f"无法找到地址: {str(e)}")
        df.loc[x, 'location_lat_lng'] = 'can not find this one...'

额外建议:尽量避免用裸except,可以捕获geopy库的具体异常(比如geopy.exc.GeocoderTimedOut、geopy.exc.GeocoderUnavailable),这样能更精准地定位问题,也不会意外捕获其他无关错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 06:44:48