使用gmplot绘制热力图时遇TypeError:需实数而非字符串
解决gmplot热力图报错TypeError: must be real number, not str的问题
我之前也碰到过类似的情况——明明pandas显示列的dtype是float64,gmplot却还是抛出了类型错误。大概率是数据里的隐藏问题或者传递方式的小细节导致的,你可以按下面的步骤逐一排查:
1. 检查并清理NaN值
gmplot的heatmap函数没法处理缺失值(NaN),哪怕列的整体dtype是float64,只要存在NaN,就可能触发类型错误。先检查缺失值数量:
print(lat_lon[['latitude', 'longitude']].isna().sum())
如果有缺失值,先清理掉再绘图:
lat_lon_clean = lat_lon.dropna(subset=['latitude', 'longitude']) gmap.heatmap(lat_lon_clean['latitude'], lat_lon_clean['longitude'])
2. 将pandas Series转换为原生列表/NumPy数组
有时候gmplot对pandas Series的兼容性不太友好,哪怕dtype正确,也可能出现识别异常。你可以把Series转换成列表或者NumPy数组再传递:
# 转换成列表 gmap.heatmap(lat_lon['latitude'].tolist(), lat_lon['longitude'].tolist()) # 或者转换成NumPy数组 gmap.heatmap(lat_lon['latitude'].values, lat_lon['longitude'].values)
3. 验证数据中是否存在隐藏的非数值内容
虽然dtype显示是float64,但极少数情况下,数据读取过程中可能混入了不可见的字符串字符(比如空格、特殊符号),导致pandas表面显示为float,但实际内部有异常。你可以尝试强制转换并检查:
# 强制转换为float,若有异常会直接抛出错误 lat_lon['latitude'] = lat_lon['latitude'].astype(float) lat_lon['longitude'] = lat_lon['longitude'].astype(float)
如果这一步报错,说明确实有隐藏的非数值内容,需要进一步清洗数据(比如用str.strip()去掉空格,或者替换异常值)。
4. 测试最小可复现案例
如果上面的步骤都没用,你可以用一组确定的数值测试,确认是数据问题还是gmplot版本问题:
import gmplot import pandas as pd # 手动构造洛杉矶附近的坐标 test_data = pd.DataFrame({ 'latitude': [34.0522, 34.0689, 34.0207], 'longitude': [-118.2437, -118.3002, -118.2899] }) gmap = gmplot.GoogleMapPlotter.from_geocode("Los Angeles", 10) gmap.heatmap(test_data['latitude'], test_data['longitude']) gmap.draw('test_crime_map.html')
如果这个测试代码能正常运行,那说明你的原始数据肯定存在异常,需要进一步排查;如果测试代码也报错,那可能是gmplot版本的问题,尝试升级到最新版本:
pip install --upgrade gmplot
内容的提问来源于stack exchange,提问作者Miguel 2488
相关产品推荐
相关产品推荐

