Python Pandas GeopyAttributeError:“ NoneType”对象没有属性“ latitude”

时间:2018-11-05 23:43:35

标签: python pandas csv geocode geopy

我在网上到处寻找试图找到解决方案的地方,但找不到任何地方。我正在从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'

即使脚本无法获得某些地址的经度或纬度,我仍然希望脚本执行该操作,该如何忽略它?

4 个答案:

答案 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



           

我遇到了同样的问题,这就是我能够解决的问题