Обработка результатов геокодирования и сохранение их в столбце Pandas - PullRequest
0 голосов
/ 25 марта 2020

Я отправляю запрос API в Карты Google, используя библиотеку geopy, чтобы получить имя области для каждого адреса в моем pandas кадре данных, а затем пытаюсь сохранить его в своем собственном столбце.

import geopy
import numpy as np

from geopy.geocoders import GoogleV3

def get_area(address):
    geolocator = GoogleV3(api_key=api_key, domain='maps.googleapis.com', scheme=None, client_id=None, 
                      secret_key=None, 
                     user_agent=None )
    geocode = RateLimiter(geolocator.geocode, min_delay_seconds=1)
    data = geocode((address), timeout=None)
    #print(data.raw)
    area = []
    for item in data.raw['address_components']:

        if data.raw is None:
            area.append(None)
            continue


        found = False
        typs = set(item['types'])
        if typs == set(['neighborhood', 'political']): 
            print(item['long_name'])
            area.append(item['long_name'])
            found = True
            break

        if not found:
            area.append(None)

    return area

df_test['Area'] = df_test[['L_Address']].apply(lambda row: get_area(row['L_Address']), axis=1)

Просто для ясности, вот как выглядит необработанный ответ от Google Maps:

{'address_components': [{'long_name': '7155', 'short_name': '7155', 'types': ['street_number']}, {'long_name': 'Hall Road', 'short_name': 'Hall Rd', 'types': ['route']}, {'long_name': 'Newton', 'short_name': 'Newton', 'types': ['neighborhood', 'political']}, 'location_type': 'ROOFTOP', 'viewport': {'northeast': {'lat': 49.1335569802915, 'lng': -122.8458199197085}, 'southwest': {'lat': 49.1308590197085, 'lng': -122.8485178802915}}}

Вот ответ, который я получаю для кода выше:

0           [None, None, None, None, None, None, None]
1           [None, None, None, None, None, None, None]
2           [None, None, None, None, None, None, None]
3                      [None, None, South Westminster]
4                                [None, None, Whalley]
5           [None, None, None, None, None, None, None]
6           [None, None, None, None, None, None, None]
7                                 [None, None, Newton]
8                                [None, None, Whalley]
9           [None, None, None, None, None, None, None]
10          [None, None, None, None, None, None, None]

Итак, я знаю Я запутался где-то в моем l oop, потому что мне нужно только одно имя области для каждой строки. Есть предложения?

1 Ответ

0 голосов
/ 25 марта 2020

Я думаю, что нашел проблему. Если вам нужно только одно значение на строку, измените свой l oop, чтобы он выглядел следующим образом:

    for item in data.raw['address_components']:

        if data.raw is None:
            area.append(None)
            break


        found = False
        typs = set(item['types'])
        if typs == set(['neighborhood', 'political']): 
            print(item['long_name'])
            area.append(item['long_name'])
            found = True
            break

        if not found:
            area.append(None)
            break

Дайте мне знать, помогло ли это! : D

...