Closed3

「住所」列から緯度経度を表・テーブルに追加したい

noznoz

Google Map API から取得

import time
import googlemaps
import pandas as pd
from tqdm import tqdm

def get_lat_lng(address, gmaps_client):
    """
    住所を基にGoogle Maps APIから緯度・経度を取得する。

    Parameters:
        address (str): 住所を示す文字列。
        gmaps_client (googlemaps.Client): Google Maps APIのクライアント。

    Returns:
        tuple: 緯度(latitude)、経度(longitude)を含むタプル。
               住所が見つからない場合は (None, None) を返す。
    """
    geocode_result = gmaps_client.geocode(address)
    if geocode_result:
        location = geocode_result[0]['geometry']['location']
        return location['lat'], location['lng']
    return None, None
noznoz

緯度経度の列を追加する関数

ライブラリは前項の関数と同じ。

def attach_geographic_coordinate(df: pd.DataFrame, address_column_name: str, api_key: str, delay: float = 0.20001) -> pd.DataFrame:
    """
    住所のデータフレームに対して、住所を基に緯度・経度の列を追加する。

    Parameters:
        df (pd.DataFrame): 住所の列を持つデータフレーム。
        address_column_name (str): 住所を表す列の列名
        api_key (str): Google Maps APIキー。
        delay (float, optional): 各リクエスト間の待ち時間(秒)。

    Returns:
        df_with_geographic_coordinate (pd.DataFrame): 「緯度」、「経度」の列を加えたデータフレーム。
    """
    gmaps = googlemaps.Client(key=api_key)

    # ユニークな住所のリストを作成
    unique_addresses = df[address_column_name].unique()
    address_to_coords = {}

    for address in tqdm(unique_addresses, desc="Geocoding unique addresses", colour='blue'):
        lat, lng = get_lat_lng(address, gmaps)
        address_to_coords[address] = (lat, lng)
        time.sleep(delay)  # APIの制限を考慮して少し待つ

    # 緯度と経度のリストを初期化
    latitudes = []
    longitudes = []

    # 元のデータフレームの各住所に対応する緯度経度を取得
    for address in df[address_column_name]:
        lat, lng = address_to_coords.get(address, (None, None))
        latitudes.append(lat)
        longitudes.append(lng)

    # 新しいデータフレームのコピーを作成して緯度・経度を追加
    df_copy = df.copy()
    df_copy['緯度'] = latitudes
    df_copy['緯度'] = df_copy['緯度'].astype("float64")
    df_copy['経度'] = longitudes
    df_copy['経度'] = df_copy['経度'].astype("float64")

    return df_copy
noznoz

使用例

  • dfは「住所」列を含むpandas.DataFrame
  • APIキーはGCPコンソールで取得します
attached_address_df = attach_geographic_coordinate(df, '住所', 'APIキーをここに書く')
このスクラップは5ヶ月前にクローズされました