Python中基于条件的Nominatim地理定位器执行报错求助
Python中基于条件的Nominatim地理定位器执行报错求助
嗨,我来帮你排查这个问题~你遇到的ValueError本质是因为函数返回值不符合pandas的预期,咱们一步步拆解问题:
错误原因分析
你的find_location函数存在两个关键问题:
- 当邮编(
place_data)也无法被Nominatim解析时,location_overall会变成None,此时返回的不是两个数值,pandas没法把它拆分成Lat和Lng两列; - 就算
location_overall解析成功,你直接返回的是Location对象,而不是它的latitude和longitude属性,同样会导致pandas无法提取数值。
修正后的代码
import pandas as pd import folium import webbrowser # 修正了你拼写错误的web-browser from geopy.geocoders import Nominatim geolocator = Nominatim(timeout=10, user_agent="Krukarius") def find_location(row): place = row['Address'] # 截取地址后8位作为邮编(如果格式有变化,这里需要调整逻辑) place_data = place[-8:] # 优先解析完整地址 location = geolocator.geocode(place) if location is not None: return location.latitude, location.longitude # 完整地址失败,尝试解析邮编 location_overall = geolocator.geocode(place_data) if location_overall is not None: return location_overall.latitude, location_overall.longitude # 两种解析都失败时,返回默认数值(也可以用pd.NA表示缺失值) return 0.0, 0.0 points = pd.read_csv("Addresses4.csv") points[['Lat','Lng']] = points.apply(find_location, axis="columns", result_type="expand") print(points) points.to_csv('NewAddresses4.csv')
关键修改说明
- 修正了
webbrowser的拼写错误,避免导入失败; - 给每个分支都明确返回两个数值类型的结果,确保pandas能正常拆分生成
Lat和Lng列; - 增加了对
location_overall的非空判断,避免返回None导致报错; - 如果两种解析都失败,你可以选择返回
0.0,0.0,也可以换成pd.NA,pd.NA,更贴合pandas的缺失值处理逻辑。
另外小提醒:如果你的地址格式不是固定后8位为邮编,建议调整place_data的截取逻辑(比如用字符串分割提取邮编),避免传入无效内容导致解析失败。
备注:内容来源于stack exchange,提问作者Geographos
相关产品推荐
相关产品推荐

