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

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

緯度経度の列を追加する関数
ライブラリは前項の関数と同じ。
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

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