You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 01:27:25