Streamlit中folium.PolyLine绘制公交线报字符串转浮点错误
Streamlit嵌入folium地图添加PolyLine触发类型转换错误解决方案
问题根因
报错ValueError: could not convert string to float的核心触发逻辑是CSV序列化/反序列化过程中坐标字段类型丢失:
- 你在Colab中直接处理JSON源数据时,
coordinates_reversed字段始终是嵌套数值列表格式,folium可以正常读取坐标值渲染折线 - 当你把DataFrame导出为CSV再在本地读取时,pandas会将列表格式的坐标值自动识别为字符串类型,不会自动解析回原生列表。传给
folium.PolyLine的locations参数实际是字符串内容,folium尝试把字符串内容转成浮点型坐标时就会抛出该错误。
你可以在本地循环渲染前加一行打印验证:
print(type(trajet_bus_fields.iloc[0]["coordinates_reversed"])) # 本地环境输出为<class 'str'>,Colab环境输出为<class 'list'>
修复方法
1. 读取CSV后手动解析坐标字段
用ast.literal_eval把字符串格式的列表转回原生Python列表,同时增加坐标格式校验,避免脏数据触发报错:
import ast import pandas as pd import folium from streamlit_folium import folium_static # 读取本地CSV文件 trajet_bus_fields = pd.read_csv("你的本地公交线路CSV文件路径.csv") # 将字符串格式的坐标解析为原生列表 trajet_bus_fields["coordinates_reversed"] = trajet_bus_fields["coordinates_reversed"].apply( lambda x: ast.literal_eval(x) if isinstance(x, str) else x ) # 渲染地图 mapish = folium.Map(location=[48.083328, -1.68333]) for _, row in trajet_bus_fields.iterrows(): popup = row['idligne'] # 校验坐标点格式,强制转浮点型 valid_coords = [] for point in row["coordinates_reversed"]: if isinstance(point, (list, tuple)) and len(point) == 2: try: valid_coords.append([float(point[0]), float(point[1])]) except (ValueError, TypeError): continue if valid_coords: folium.PolyLine( locations=valid_coords, weight=3, popup=popup, color="red" ).add_to(mapish) folium_static(mapish)
2. 避免类型丢失的存储优化
如果需要跨环境传输带嵌套列表/复杂结构的DataFrame,不要使用CSV格式存储,改用parquet或者pickle格式,可以完整保留字段的原始数据类型,省去手动解析的步骤:
# Colab中存储时用parquet trajet_bus_fields.to_parquet("bus_route.parquet") # 本地读取时直接加载,字段类型和Colab中完全一致 trajet_bus_fields = pd.read_parquet("bus_route.parquet")
注意:你之前初始化
coordinates_reversed字段用的np.empty((len(trajet_bus_fields), 0)).tolist()逻辑本身没有问题,问题出在CSV读写环节的类型自动转换,和Streamlit、folium库本身的兼容性无关。
内容的提问来源于stack exchange,提问作者user18804467
相关产品推荐
相关产品推荐

