如何使用 Pandas apply 处理来自 GeoPy 客户端的响应 "None"?

How to handle response "None" from GeoPy client using Pandas apply?

我正在处理具有数百个地址的 pandas 数据框,试图添加一个包含从 geopy 接收的坐标的新列。

主要问题:如何处理未解析的geopy地址,结果为“None”?

我是 python 的新手,不确定如何前进。

我的代码可以运行,但是一旦 Latitude/Longitude 不在数据库中并且我收到响应“None”就会停止。

原文:

new_df["coords"] = (
    new_df["address"]
    .progress_apply(geolocator)
    .apply(lambda x: (x.latitude, x.longitude))
)

尝试进行如下锻炼:

new_df["coords"] = (
    new_df["address"]
    .progress_apply(geolocator)
    .apply(lambda x: np.nan if x == "" else (x.latitude, x.longitude))
)

但我一直收到错误消息: AttributeError: 'NoneType' object has no attribute 'latitude' 我想不出如何绕过它...

我目前正在测试 2 个地址:

  1. "Angyalföld - Béke-Tatai utcai lakótelep" - 给出结果 None
  2. “布达佩斯,Bercsényi utca,匈牙利”- 正常工作

下面用于测试的完整代码,- 没有第一个地址也能很好地工作:

from random import randint

import pandas as pd
from geopy.exc import *
from geopy.extra.rate_limiter import RateLimiter
from geopy.geocoders import Nominatim
from tqdm import tqdm

tqdm.pandas()  # progress bar
data = ["Budapest, Bercsényi utca, Hungary", "Angyalföld - Béke-Tatai utcai lakótelep"]
df = pd.DataFrame(data, columns=["address"])

user_agent = "geopy_user_{}".format(randint(10000, 99999))
app = Nominatim(user_agent=user_agent)
geolocator = RateLimiter(app.geocode, min_delay_seconds=1)

try:
    df["coords"] = (
        df["address"]
        .progress_apply(geolocator)
        .apply(
            lambda x: (x.latitude, x.longitude)
            if hasattr(x, "latitude") and hasattr(x, "longitude")
            else pd.NA
        )
    )
    print(df)
except GeocoderServiceError as e:
    print("Failed")
    print(e)  # not yet sure how to handle errors - please ignore or advise

一种解决方法是通过使用 Python built-in 函数 [=13] 检查 x 是否具有“纬度”和“经度”属性来防止 apply 失败=],像这样:

df["coords"] = (
    df["address"]
    .progress_apply(geolocator)
    .apply(
        lambda x: (x.latitude, x.longitude)
        if hasattr(x, "latitude") and hasattr(x, "longitude")
        else pd.NA
    )
)