猿问

在熊猫中使用地理编码器 api 查找位置

我在熊猫数据框中有一系列城市名称。为此,我需要找出特定城市的地址并将它们存储在同一数据框中的单独列中。City 列也包含 NaN 值。我正在分别获取给定位置/城市名称的地址。但它在熊猫数据框中不起作用


data = [['madurai',10],['NaN',12],['hosur',13]]

df = pd.DataFrame(data,columns=['Name','Age'])

from geopy.geocoders import Nominatim

geolocator = Nominatim()

for i in df.Name:

    if i == "NaN":

       continue

    loc = geolocator.geocode(i)

address = loc.address

print(address)

它适用于数据框,但仅返回最后一个地址,而不是整个 3 个城市。如果我们改变如下顺序,


data = [['Nan',10],['Madurai',12],['hosur',13]]

df = pd.DataFrame(data,columns=['Name','Age'])

我收到错误:GeocoderTimedOut:服务超时


查询: 1. 我希望将结果(地址)保存在列中 2. 如何处理 Nan 值


凤凰求蛊
浏览 255回答 3
3回答

绝地无双

您可以通过以下方式添加带有地址的列:import pandas as pddata = [['madurai',10],['NaN',12],['hosur',13]]df = pd.DataFrame(data,columns=['Name','Age'])from geopy.geocoders import Nominatimgeolocator = Nominatim()for i in df.Name:    if i == "NaN":        continue    df.loc[df.Name == i, 'Address'] = geolocator.geocode(i)print(df)

富国沪深

您只能获得最后一个值,因为您loc每次都在循环中进行替换。该GeocoderTimedOut: Service timed out错误的出现是因为你正在为许多请求到服务器。您应该sleep在请求之间包含一个。尝试:import pandas as pdfrom geopy.geocoders import Nominatimimport timedata = [['madurai',10],['NaN',12],['hosur',13]]df = pd.DataFrame(data,columns=['Name','Age'])geolocator = Nominatim(user_agent='test')address = []for i in df.Name:    time.sleep(3)    if i == "NaN":       address.append('NaN')       continue        address.append(geolocator.geocode(i))df['address'] = address

潇湘沐

我在下面的请求之间引入了时间延迟和几行来查看进度条from geopy.geocoders import Nominatimgeolocator = Nominatim()from geopy.extra.rate_limiter import RateLimitergeocode = RateLimiter(geolocator.geocode, min_delay_seconds=1)final['Geolocation'] = final['city'].apply(geocode)from tqdm import tqdmtqdm.pandas()final['Geolocation'] = final['city'].progress_apply(geocode)它现在有效。
随时随地看视频慕课网APP

相关分类

Python
我要回答