Geopy Nominatim - неправильное определение координат

Взяты станы и регионы из таблиц по запросам в wordstat. Код должен искать координаты регионов с помощью geopy и в итоге добавлять столбцы с широтой и долготой. Конечная цель - изображение точек на карте.

from geopy.geocoders import Nominatim

geolocator = Nominatim(user_agent="Stiven")

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

wordstat['Coordinates'] = wordstat[0].map(get_coords)
#wordstat = wordstat.dropna()
wordstat[["Latitude", "Longitude"]] = pd.DataFrame(wordstat['Coordinates'].tolist(), columns=["lat", "long"])
del wordstat['Coordinates']
#wordstat = wordstat.dropna()
wordstat[:20]

Output:

    0   1   2   Latitude    Longitude
1   Область Арарат  4189    194.0   35.000074   104.999927
2   **Китай 48341   173.0   66.000647   169.490087**
3   Чукотский автономный округ  14353   160.0   43.736833   41.726799
5   Карачаево-Черкесская Республика 97196   141.0   40.248330   45.145513
6   Черногория  4009    141.0   38.628173   70.815654
7   Область Гехаркуник  3406    138.0   46.622503   31.099490
8   Таджикистан 118110  136.0   67.678325   57.062685
9   Южный АО    2023    136.0   45.564344   17.011895
10  Ненецкий автономный округ   25157   136.0   45.813311   14.480837
11  Хорватия    1932    134.0   67.147163   74.341549
12  Словения    2048    134.0   34.982302   33.145128
13  Ямало-Ненецкий автономный округ 348596  134.0   41.526535   43.246957
15  Кипр    8439    131.0   51.478180   7.554234
16  Самцхе-Джавахети    2511    129.0   45.189003   34.740110
17  Новая Зеландия  1368    129.0   63.246778   25.920916
18  Северный Рейн-Вестфалия 2312    128.0   44.863258   43.440691
19  Республика Крым 1304900 127.0   63.551503   154.014726
21  Финляндия   18286   126.0   50.708012   37.583762
22  Ставропольский край 1316045 123.0   54.475184   45.021182
23  Магаданская область 52366   123.0   52.887332   33.415853

Если же изобразить точки на карте (через Plotly, go.Figure) получается, что Китай находится около Камчатки, Япония - на Средиземном море, а Архангельская область - в Норвегии. Проверив получившиеся координаты с настоящими нашла множество ошибок (но наверняка, они везде), так что проблема точно с ними, а не с графиком. введите сюда описание изображения


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

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

Вы неправильно использовали решение, данное на ваш предыдущий вопрос - не указали index в конструкторе pd.DataFrame():

# даем столбцам нормальные названия
df.columns = ["name", "val1", "val2"]
# получаем координаты    
df["coords"] = df["name"].map(get_coords)
df[["lat", "lon"]] = \
    pd.DataFrame(df.pop("coords").tolist(),
                 columns=["lat", "long"], 
                 index=df.index)

получим:

In [203]: df
Out[203]:
                               name     val1   val2        lat         lon
0                    Область Арарат     4189  194.0  39.855342   44.694583
1                             Китай    48341  173.0  35.000074  104.999927
2        Чукотский автономный округ    14353  160.0  66.000647  169.490087
3   Карачаево-Черкесская Республика    97196  141.0  43.736833   41.726799
4                        Черногория     4009  141.0  42.986885   19.518099
5                Область Гехаркуник     3406  138.0  40.248330   45.145513
6                       Таджикистан   118110  136.0  38.628173   70.815654
7                          Южный АО     2023  136.0  46.622503   31.099490
8         Ненецкий автономный округ    25157  136.0  67.678325   57.062685
9                          Хорватия     1932  134.0  45.564344   17.011895
10                         Словения     2048  134.0  45.813311   14.480837
11  Ямало-Ненецкий автономный округ   348596  134.0  67.147163   74.341549
12                             Кипр     8439  131.0  34.982302   33.145128
13                 Самцхе-Джавахети     2511  129.0  41.526535   43.246957
14                   Новая Зеландия     1368  129.0 -41.500083  172.834408
15          Северный Рейн-Вестфалия     2312  128.0  51.478180    7.554234
16                  Республика Крым  1304900  127.0  45.189003   34.740110
17                        Финляндия    18286  126.0  63.246778   25.920916
18              Ставропольский край  1316045  123.0  44.863258   43.440691
19              Магаданская область    52366  123.0  63.551503  154.014726

рисуем на карте:

import plotly.express as px

fig = px.scatter_geo(df, lat="lat", lon="lon", hover_name="name", size="val1")
fig.show()

результат:

введите сюда описание изображения

→ Ссылка
Автор решения: jane

Проблема была не с определением координат, а выделением долготы и широты. С добавлением последнего параметра проблема исчезла.

df[["Latitude", "Longitude"]] = pd.DataFrame(df['Coordinates'].tolist(), 
                                             columns=["lat", "long"], 
                                             index=df.index)

Иначе получалось следующее введите сюда описание изображения

→ Ссылка