如何在Python 3 Pandas中创建含Google Maps地理位置的DataFrame?
如何为包含地址的Pandas DataFrame添加Google Maps地理位置信息
嘿,我看你已经有了一个包含安保企业信息的DataFrame,想要给它加上Google Maps的经纬度坐标对吧?这事儿不难,我给你一步步拆解具体怎么做,用Python 3、Pandas搭配Google Maps的地理编码API就能搞定。
1. 先搞定依赖和API密钥
首先得安装官方的Google Maps Python客户端库,打开终端跑这个命令:
pip install googlemaps
然后你需要去Google Cloud平台申请一个Geocoding API密钥,记得要先启用Geocoding API服务,还要注意API的计费规则——免费额度有限,超出会收费,调用的时候别太猛哦。
2. 写个地理编码的工具函数
接下来写个函数,输入地址字符串,就能返回对应的纬度和经度。还要处理一些异常情况,比如地址找不到、API调用失败的情况:
import googlemaps import time import pandas as pd # 替换成你自己的API密钥 gmaps_client = googlemaps.Client(key='你的Google Maps API密钥') def get_lat_lng(address): try: # 调用地理编码接口 geocode_result = gmaps_client.geocode(address) if geocode_result: # 从返回结果里提取经纬度 location = geocode_result[0]['geometry']['location'] return location['lat'], location['lng'] else: # 地址没找到的情况返回空值 return None, None except Exception as e: print(f"处理地址「{address}」时出错: {str(e)}") return None, None
3. 给你的DataFrame生成完整地址
地理编码的准确性依赖于完整的地址,你可以把DataFrame里的相关字段(比如企业名称、州)拼接成完整地址列。比如:
# 假设你还有其他地址字段(比如城市、街道),可以一起加进去,地址越详细越准确 consolidado['full_address'] = consolidado.apply( lambda row: f"{row['nome_empresa']}, {row['estado']}", axis=1 )
4. 把函数应用到DataFrame,生成经纬度列
因为Google API有调用频率限制(免费版一般每秒最多5次),所以最好加个小延迟避免被限流。我们可以用带延迟的版本:
def get_lat_lng_with_delay(address): time.sleep(0.2) # 每次调用间隔0.2秒,刚好符合每秒5次的限制 return get_lat_lng(address) # 应用带延迟的函数,生成经纬度列 consolidado[['latitude', 'longitude']] = consolidado['full_address'].apply( lambda x: pd.Series(get_lat_lng_with_delay(x)) )
5. 检查和清理结果
最后看看生成的列,处理空值:
# 查看有多少行没获取到坐标 print(f"未获取到坐标的行数: {consolidado[consolidado['latitude'].isnull()].shape[0]}") # 可以选择删除空值行,或者根据需求填充默认值 consolidado_clean = consolidado.dropna(subset=['latitude', 'longitude'])
这样你就得到一个包含Google Maps地理位置信息的DataFrame啦!
内容的提问来源于stack exchange,提问作者Reinaldo Chaves
相关产品推荐
相关产品推荐

