我在网上到处寻找试图找到解决方案的地方,但找不到任何地方。我正在从CSV文件中读取地址并进行地址解析,并将两个新列写入新的CSV中。这适用于我选择的较小样本量,但是看来我的API无法获得某些地址的经度和纬度值,从而导致错误。这是我的代码:
import geopy
import pandas
from geopy.geocoders import Bing
def main():
io = pandas.read_csv('newoutput3.csv',index_col=None, header=0,
sep=",",encoding='cp1252')
def get_latitude(x):
if x.latitude is None:
x.latitude = None
else:
return x.latitude
def get_longitude(x):
if x.longitude is None:
x.longitude = None
else:
return x.longitude
geolocator = Bing('myAPIkey',timeout=5)
geolocate_column = io['ADDRESS'].apply(geolocator.geocode)
io['latitude'] = geolocate_column.apply(get_latitude)
io['longitude'] = geolocate_column.apply(get_longitude)
io.to_csv('geocoding-output17.csv')
if __name__ == '__main__':
main()
File "C:/Users/Chris/Downloads/WPy-3662/scripts/geocoder.py", line 16, in
get_latitude
if x.latitude is None:
AttributeError: 'NoneType' object has no attribute 'latitude'
即使脚本无法获得某些地址的经度或纬度,我仍然希望脚本执行该操作,该如何忽略它?
答案 0 :(得分:1)
jfbeltran关于ERROR conda.core.link:_execute(502): An error occurred while installing package 'conda-forge::automat-0.7.0-py_1'.
CondaError: Cannot link a source that does not exist. C:\Users\bharat.c.ruparel\AppData\Local\Continuum\anaconda3\Scripts\conda.exe
的值与对象实例的不存在属性之间的区别是正确的。 geopy的地址解析方法return None用于尚未找到的位置。
IMO是一种更好的解决您的问题的方法,它不需要定义自己的功能:
None
特别是对于geopy,您可能会发现import operator
non_null_geolocate_column = geolocate_column[~geolocate_column.isnull()]
io['latitude'] = None
io['latitude'] = non_null_geolocate_column.apply(operator.attrgetter('latitude'))
io['longitude'] = None
io['longitude'] = non_null_geolocate_column.apply(operator.attrgetter('longitude'))
文档部分有帮助:https://geopy.readthedocs.io/en/stable/#usage-with-pandas
答案 1 :(得分:0)
以“无”为值的属性与根本不存在的属性之间存在差异。这类似于未定义的变量:如果未定义my_variable
而不返回False
,则下面的代码将失败:
>>> my_variable == None
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'my_variable' is not defined
要检查对象是否具有名称经度的属性,可以使用:
# Returns True/False depending on whether x.longitude is an existing attribute
>>> hasattr(x, 'longitude')
False
为了在代码中看到此行为,您可以像下面这样更改函数get_longitude / get_latitude:
def get_latitude(x):
if hasattr(x,'latitude') and (x.latitude is not None):
return x.latitude
def get_longitude(x):
if hasattr(x,'longitude') and (x.longitude is not None):
return x.longitude
答案 2 :(得分:0)
要从具有地址的列中获取坐标,这也可以正常工作:
df.column.apply
(
lambda x: geolocator.geocode(x).latitude if geolocator.geocode(x) != None else 'NF'
)
答案 3 :(得分:0)
这里的问题是您正试图从None对象获取“纬度”和“经度”。基本上是在做None.latitude。因此,解决此问题的最佳方法是,在尝试访问“经度”和“纬度”之前,先检查地址解析器是否返回了值。
lat = []
long = []
for row in io['ADDRESS']:
addr = geolocator.geocode(row, timeout=10)
if addr is None:
lat.append(None)
long.append(None)
else:
latitude = ad.latitude
longitude = ad.longitude
lat.append(latitude)
long.append(longitude)
io['latitude'] = lat
io['longitude'] = long
我遇到了同样的问题,这就是我能够解决的问题