Я начинаю с pandas фрейма данных исторических мест. Я передаю столбец географических названий для геокодирования. Я извлекаю координаты и превращаю их в точки. Я также сохраняю возвращенный геокодером geopy.location.Location в столбце для дальнейшего использования. Кажется, все это работает нормально, если я запускаю его для всего (географического) фрейма данных.
Проблема возникает, когда я хочу перезаписать несколько записей. Например, я хочу перезаписать везде, где геокодер пытался и не смог правильно определить «Far go N Dak» (историческое сокращение). Я могу повторно запустить геокодер на одном модернизированном названии места и извлечь данные, но не могу понять, как вставить его в исходный файл gdf.
import numpy as np
import pandas as pd
import geopandas as gpd
from geopy.extra.rate_limiter import RateLimiter
from geopy.geocoders import Nominatim
#set up Nominatim geocoder with geopy package with a user_agent (required) and a rate limiter
Ngeocoder0 = Nominatim(user_agent="aGeocoder")
Ngeocoder = RateLimiter(Ngeocoder0.geocode, min_delay_seconds=1)
#make some toy data
lst = ['Minneapolis MN', 'Fargo ND', 'Fargo N Dak']
df = pd.DataFrame(lst,columns =['rawPOB'])
df['_TEMP'] = df['rawPOB'].apply(lambda x: Ngeocoder(x, language='en',addressdetails=True))
df['rawGCcoords']=df['_TEMP'].apply(lambda x: (x.point[1], x.point[0]) if x else None)
df['rawGClong']=df['_TEMP'].apply(lambda x: (x.point[1]) if x else None)
df['rawGClat']=df['_TEMP'].apply(lambda x: (x.point[0]) if x else None)
gdf = gpd.GeoDataFrame(df, geometry=gpd.points_from_xy(df['rawGClong'], df['rawGClat']))
#so far so good, except Fargo N Dak is not recognized as Fargo North Dakota
#code just this place...
manualentry= Ngeocoder('Fargo North Dakota', language='en',addressdetails=True)
manualcoords=(manualentry.point[1], manualentry.point[0])
#... but here it all goes wrong when try to insert
gdf.loc[gdf.rawPOB == 'Fargo N Dak', '_TEMP'] = manualentry
gdf.loc[gdf.rawPOB == 'Fargo N Dak', 'rawGCcoords'] = manualcoords
#trying .at instead, and checking data type as in https://stackoverflow.com/questions/27949671/add-a-tuple-to-a-specific-cell-of-a-pandas-dataframe
gdf.dtypes
gdf.at[gdf.rawPOB == 'Fargo N Dak', 'rawGCcoords'] = manualcoords
# :(
Что мне не хватает?
Спасибо.
PS В этом примере я, конечно, мог бы очистить данные, прежде чем пытаться их геокодировать, но я пытаюсь создать рабочий процесс, в котором я мог бы сначала использовать сопоставленные результаты геокодирования для поиска менее очевидных ошибок.