【问题标题】:finding location using geocoder api in pandas在 pandas 中使用地理编码器 api 查找位置
【发布时间】:2019-03-17 09:55:02
【问题描述】:

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

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: Service timed out

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

【问题讨论】:

    标签: python pandas google-geocoder geocoder


    【解决方案1】:

    您可以通过这种方式添加包含地址的列:

    import pandas as pd
    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
        df.loc[df.Name == i, 'Address'] = geolocator.geocode(i)
    
    print(df)
    

    【讨论】:

    • 出现错误:ValueError: setting an array element with a sequence
    • 问题是geolocator.geocode(i)返回的是一个序列而不是一个值。 print(geolocator.geocode(i)) 返回什么?我没有你的数据,所以我无法重现,但如果你在df.loc[df.Name == i, 'Address'] = 'address_string' 中放入一个通用字符串,代码会按预期工作,因此请尝试修复该部分。也许geolocator.geocode(i)[0] 就够了……
    【解决方案2】:

    您只能获得最后一个值,因为您在循环中每次都在替换 loc。 出现GeocoderTimedOut: Service timed out 错误是因为您向服务器发出了许多请求。您应该在请求之间包含sleep。如果您仍然收到此错误,请查看:Link - Avoid time out

    试试:

    import pandas as pd
    from geopy.geocoders import Nominatim
    import time
    
    data = [['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
    

    【讨论】:

      【解决方案3】:

      我在下面引入了请求之间的时间延迟和几行来查看进度条

      from geopy.geocoders import Nominatim
      geolocator = Nominatim()
      from geopy.extra.rate_limiter import RateLimiter
      geocode = RateLimiter(geolocator.geocode, min_delay_seconds=1)
      final['Geolocation'] = final['city'].apply(geocode)
      from tqdm import tqdm
      tqdm.pandas()
      final['Geolocation'] = final['city'].progress_apply(geocode)
      

      现在可以了。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-12-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-05-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多