Ошибка при вызове apply(): "'NoneType' object is not subscriptable"

Код должен добавлять стобец с долготой и широтой адресов, расположенных в 0 столбце.

pip install geopy

def get_lat(address):
   return geolocator.geocode(address)[1][0]
def get_long(address):
   return geolocator.geocode(address)[1][1]
from geopy.geocoders import Nominatim
wordstat["Latitude"] = wordstat[0].apply(get_lat)
wordstat["Longitude"] = wordstat[0].apply(get_long)

Ошибка:

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-183-14d67a60b5f8> in <module>
      4     return geolocator.geocode(address)[1][1]
      5 from geopy.geocoders import Nominatim
----> 6 wordstat["Latitude"] = wordstat[0].apply(get_lat)
      7 wordstat["Longitude"] = wordstat[0].apply(get_long)

C:\Conda\lib\site-packages\pandas\core\series.py in apply(self, func, convert_dtype, args, **kwds)
   4040             else:
   4041                 values = self.astype(object).values
-> 4042                 mapped = lib.map_infer(values, f, convert=convert_dtype)
   4043 
   4044         if len(mapped) and isinstance(mapped[0], Series):

pandas\_libs\lib.pyx in pandas._libs.lib.map_infer()

<ipython-input-183-14d67a60b5f8> in get_lat(address)
      1 def get_lat(address):
----> 2     return geolocator.geocode(address)[1][0]
      3 def get_long(address):
      4     return geolocator.geocode(address)[1][1]
      5 from geopy.geocoders import Nominatim

TypeError: 'NoneType' object is not subscriptable

Мой DataFramewordstat[:10]:

     0  1   2
0   Евразия 83 517 853  99%
1   Россия  79 835 978  103%
2   Центральный федеральный округ   27 477 988  100%
3   Москва и Московская область 16 629 746  93%
4   Приволжский федеральный округ   14 616 026  104%
5   Москва  11 094 031  91%
6   Сибирский федеральный округ 8 334 963   105%
7   Северо-Западный федеральный округ   8 290 530   99%
8   Южный федеральный округ 7 185 446   112%
9   Уральский федеральный округ 6 758 533   105%

Ответы (1 шт):

Автор решения: MaxU

Проблема возникает тогда, когда адрес не находится и geolocator.geocode() возвращает None.

Кроме этого вы два раза вызываете функцию geolocator.geocode() для каждого адреса - это будет долго работать. В моей версии (см. ниже) используется один вызов.

Попробуйте так:

from geopy.geocoders import Nominatim

geolocator = Nominatim(user_agent="My_GEO_Locator")

def get_coords(address, geolocator=geolocator):
    if geolocator is None:
        geolocator = Nominatim(user_agent="My_GEO_Locator")
    ret = geolocator.geocode(address)
    if ret is None:
        return None
    return ret.latitude, l1.longitude

df["coords"] = df[0].map(get_coords)
df[["Latitude", "Longitude"]] = \
    pd.DataFrame(df["coords"].tolist(), columns=["lat", "long"], index=df.index)

пример исходного фрейма (обратите внимание на последнюю строку):

In [122]: df
Out[122]:
                                    0   1    2    3     4
0                             Евразия  83  517  853   99%
1                              Россия  79  835  978  103%
2       Центральный федеральный округ  27  477  988  100%
3         Москва и Московская область  16  629  746   93%
4       Приволжский федеральный округ  14  616   26  104%
5                              Москва  11   94   31   91%
6         Сибирский федеральный округ   8  334  963  105%
7   Северо-Западный федеральный округ   8  290  530   99%
8             Южный федеральный округ   7  185  446  112%
9         Уральский федеральный округ   6  758  533  105%
10                Заполярный Засранск  10   10   10   10%

результат:

In [123]: df
Out[123]:
                                    0   1    2    3     4                            coords   Latitude  Longitude
0                             Евразия  83  517  853   99%  (52.78721935, 50.77496358049139)  52.787219  50.774964
1                              Россия  79  835  978  103%   (64.6863136, 50.77496358049139)  64.686314  50.774964
2       Центральный федеральный округ  27  477  988  100%  (54.59079275, 50.77496358049139)  54.590793  50.774964
3         Москва и Московская область  16  629  746   93%   (55.0874877, 50.77496358049139)  55.087488  50.774964
4       Приволжский федеральный округ  14  616   26  104%   (55.7359267, 50.77496358049139)  55.735927  50.774964
5                              Москва  11   94   31   91%   (55.7504461, 50.77496358049139)  55.750446  50.774964
6         Сибирский федеральный округ   8  334  963  105%   (65.2729258, 50.77496358049139)  65.272926  50.774964
7   Северо-Западный федеральный округ   8  290  530   99%  (66.41501975, 50.77496358049139)  66.415020  50.774964
8             Южный федеральный округ   7  185  446  112%  (47.23590355, 50.77496358049139)  47.235904  50.774964
9         Уральский федеральный округ   6  758  533  105%  (62.85576715, 50.77496358049139)  62.855767  50.774964
10                Заполярный Засранск  10   10   10   10%                              None        NaN        NaN
→ Ссылка