调用GoogleMaps API获取地址经纬度写入Pandas DataFrame列报错求助
报错原因分析
- 第一个报错
cannot concatenate object of type '<class 'float'>':你错误使用了df['lat'].append()方法,pandas.Series.append仅支持拼接Series、DataFrame类的对象,不能直接拼接浮点数;且你已经提前初始化了和原DataFrame长度一致的lat、lng列,完全不需要使用append操作,直接按行索引赋值即可。 - 第二个报错
list indices must be integers or slices, not str:你的类型转换代码语法错误,geo_location(['location']['lng'])把geo_location当成了函数调用,同时错误用字符串'location'索引列表,触发了类型错误,这个转换逻辑本身也不需要。
正确实现代码
import pandas as pd import googlemaps import time # 可选,用于控制API请求频率 # 初始化Google Maps客户端,替换为你自己的API密钥 maps = googlemaps.Client(key='你的Google Maps API密钥') locations = df['ADDR'] # 初始化空列,用pd.NA更规范,方便后续处理缺失值 df['lat'] = pd.NA df['lng'] = pd.NA # 用enumerate直接获取行索引,不需要手动计数 for idx, location in enumerate(locations): try: print(f"{idx+1} 正在处理地址: {location}") geo_location = maps.geocode(location)[0].get('geometry') lat = geo_location['location']['lat'] lng = geo_location['location']['lng'] print(f"解析结果: 纬度 {lat}, 经度 {lng}") # 按当前行索引赋值,保证和地址一一对应 df.loc[idx, 'lat'] = lat df.loc[idx, 'lng'] = lng # 可选:控制请求频率避免触发API配额限制 time.sleep(0.1) except IndexError: print(f"地址 {location} 解析失败,地址有误") except Exception as e: print(f"处理地址 {location} 时发生未知错误: {e}") # 处理完成后可查看前几行验证结果 print(df.head())
补充说明
如果你的DataFrame索引不是默认的从0开始的连续整数,把循环改为for idx, location in locations.items(),即可拿到原DataFrame的真实索引,避免赋值错位。
内容的提问来源于stack exchange,提问作者Lee Vincent
相关产品推荐
相关产品推荐

