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

Using structured queries to geocode records in a pandas dataframe using GeoPy

我想使用结构化查询在 GeoPy 中进行地理编码,并且我想 运行 在大量观察中这样做。我不知道如何使用 pandas 数据框(或可以轻松转换为 pandas 数据框的东西)进行这些查询。

首先,一些设置:

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 列逐行转换为字典,将这些字典用作结构化查询,并将结果放回 pandas 数据框?

谢谢!

一种方法是使用 DataFrame 的 apply 方法而不是 Series。这会将整行传递给 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
)