folium中使用for循环添加标记时触发KeyError: 0问题排查
报错原因
KeyError: 0的触发根源是:你手动维护从0开始递增的下标i,用geo_df.列名[i]的方式取值时,pandas/geopandas默认是按行索引标签查找,不是按行的物理位置查找。
你的geo_df大概率在之前的处理步骤(比如要素筛选、切片、空间连接、去重)中打乱了默认的0起始连续整数索引,行标签里不存在值为0的索引,所以第一次循环取geo_df.Type[0]时就直接抛出键不存在的错误。
另外你原有代码的弹窗内容拼接部分还有个语法疏漏:"Country: "对应的代码行末尾缺少字符串拼接符+,修复索引问题后这个疏漏也会触发语法报错。
修复方案
最稳妥的写法是放弃手动维护计数器i,直接用GeoDataFrame自带的iterrows()方法逐行遍历,完全不需要关心原索引是什么,同时规避拼接语法问题:
import folium # 注意:不要把地图对象命名为map,会覆盖Python内置map函数,建议自定义命名 volcano_map = folium.Map(location=[自定义初始纬度, 自定义初始经度], zoom_start=4) for idx, row in geo_df.iterrows(): # folium标记要求坐标顺序为[纬度, 经度],对应点对象的y、x属性 coordinates = [row.geometry.y, row.geometry.x] # 按火山类型分配标记颜色 if row.Type == "Stratovolcano": type_color = "green" elif row.Type == "Complex volcano": type_color = "blue" elif row.Type == "Shield volcano": type_color = "orange" elif row.Type == "Lava dome": type_color = "pink" else: type_color = "purple" # 用f-string拼接弹窗内容,避免遗漏拼接符 popup_content = f""" Year: {row.Year}<br> Name: {row.Name}<br> Country: {row.Country}<br> Type: {row.Type}<br> Coordinates: {coordinates} """ # 向地图添加标记 folium.Marker( location=coordinates, popup=popup_content, icon=folium.Icon(color=type_color) ).add_to(volcano_map)
如果你想保留原来先构建坐标列表、手动维护计数器的写法,任选以下一种改法即可解决索引问题:
- 循环前重置索引,把行标签恢复为0起始的连续整数,记得补上弹窗拼接处缺失的
+:
geo_df = geo_df.reset_index(drop=True) geo_df_list = [[point.xy[1][0], point.xy[0][0]] for point in geo_df.geometry ] # 后续原有逻辑可正常运行
- 所有取行字段值的位置改用
.iloc按物理行位置取值,不依赖行索引标签:
# 例:将geo_df.Type[i] 改为 geo_df.Type.iloc[i] # 所有取Year、Name、Country、Type字段的位置都加上.iloc即可
内容的提问来源于stack exchange,提问作者marcelo_sr
相关产品推荐
相关产品推荐

