使用 GeoPy 使用结构化查询对熊猫数据帧中的记录进行地理编码



我想使用结构化查询在GeoPy中进行地理编码,我想在大量观测值上运行它。我不知道如何使用熊猫数据帧(或可以轻松地与熊猫数据帧转换的东西(进行这些查询。

首先,一些设置:

from geopy.extra.rate_limiter import RateLimiter
from geopy.geocoders import Nominatim
Ngeolocator = Nominatim(user_agent="myGeocoder")
Ngeocode = RateLimiter(Ngeolocator.geocode, min_delay_seconds=1)
df = pandas.DataFrame(["Bob", "Joe", "Ed"])
df["CLEANtown"] = ['Harmony', 'Fargo', '']
df["CLEANcounty"] = ['', '', 'Traill']
df["CLEANstate"] = ['Minnesota', 'North Dakota', 'North Dakota']
df["full"]=['Harmony, Minnesota','Fargo, North Dakota','Traill County, North Dakota']
df.columns = ["name"] + list(df.columns[1:])

我知道如何通过提供字典在单个位置运行结构化查询。 即:

q={'city':'Harmony', 'county':'', 'state':'Minnesota'}
testN=Ngeocode(q,addressdetails=True)

而且我知道如何仅使用填充字符串的单个列从数据帧进行地理编码。 即:

df['easycode'] = df['full'].apply(lambda x: Ngeocode(x, language='en',addressdetails=True).raw)

但是,如何将 CLEANtown、CLEANCounty 和 CLEANstate 列逐行转换为字典,将这些字典用作结构化查询,并将结果放回熊猫数据帧?

谢谢!

一种方法是使用数据帧apply而不是系列。这会将整行传递给 lambda。例:

df["easycode"] = df.apply(
lambda row: Ngeocode(
{
"city": row["CLEANtown"],
"county": row["CLEANcounty"],
"state": row["CLEANstate"],
},
language="en",
addressdetails=True,
).raw,
axis=1,
)

同样,如果你想先创建一行字典,你可以做:

df["full"] = df.apply(
lambda row: {
"city": row["CLEANtown"],
"county": row["CLEANcounty"],
"state": row["CLEANstate"],
},
axis=1,
)
df["easycode"] = df["full"].apply(
lambda x: Ngeocode(
x,
language="en",
addressdetails=True,
).raw
)

最新更新