Ошибка при вызове 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