如何使用 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 个地址:
- "Angyalföld - Béke-Tatai utcai lakótelep" - 给出结果 None
- “布达佩斯,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
)
)
我正在处理具有数百个地址的 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 个地址:
- "Angyalföld - Béke-Tatai utcai lakótelep" - 给出结果 None
- “布达佩斯,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
)
)