Python Pandaas GeopyAttributeError: у объекта 'NoneType' нет атрибута 'широта' - PullRequest
0 голосов
/ 06 ноября 2018

Я искал повсюду в Интернете, пытаясь найти решение, но нигде не могу его найти. Я читаю адрес из файла 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'

Я все еще хочу, чтобы скрипт делал то, что он делает, даже если он не может получить широту или долготу для определенных адресов, как мне игнорировать его?

Ответы [ 2 ]

0 голосов
/ 06 ноября 2018

jfbeltran прав насчет разницы между None для значения и несуществующим атрибутом для экземпляра объекта. методы геокода geopy возвращают None для местоположений, которые не были найдены.

Вот, IMO, лучший способ решить вашу проблему, который не требует определения собственных функций:

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'))

В частности, для геопсии вам может быть полезен раздел документации Usage with pandas: https://geopy.readthedocs.io/en/stable/#usage-with-pandas

0 голосов
/ 06 ноября 2018

Существует разница между атрибутом, имеющим значение "Нет", и атрибутом, который вообще не существует. Это аналог неопределенной переменной: приведенный ниже код завершается ошибкой, когда 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
...