如何解决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
相关产品推荐
相关产品推荐

