首次使用folium绘制邮政编码分级统计图报IndexError该如何解决
错误根因
你当前遇到的IndexError是因为folium.Choropleth的columns参数要求必须传入包含两个元素的列表:第一个是用来和GeoJSON属性匹配的关联列(也就是你的邮编列),第二个是用来给区域分级染色的数值列。你只传了一个列,folium内部尝试读取第二个列时就触发了索引越界错误。
问题排查&解决步骤
- 首先明确你要用来做分级染色的数值指标:分级统计图的核心是用不同颜色展示不同邮编区域的某个数值差异,比如每个邮编的工单数量、平均配送时长、人口密度等,你需要先确定这个指标对应的列。
- 如果你要展示的是每个邮编对应的慢处理工单数量,首先对数据框做聚合得到数值列:
# 统计每个邮编对应的慢处理工单数,生成新的数值列slow_case_count slow_agg = slow_to_resolve['zipcode'].value_counts().reset_index(name='slow_case_count')
- 调整
Choropleth参数的columns为两个元素,第一个是关联列,第二个是染色用的数值列:
folium.Choropleth( geo_data='../data/tn_tennessee_zip_codes_geo.min.json', data=slow_agg, # 用聚合后的新数据框 columns=['zipcode', 'slow_case_count'], # 必须传两个列 key_on='feature.properties.ZCTA5CE10', fill_color='BuPu', fill_opacity=0.7, line_opacity=0.2, legend_name='慢处理工单数量' # 图例名称对应你的染色指标 ).add_to(nash_map) folium.LayerControl().add_to(nash_map) nash_map
- 额外注意邮编格式匹配问题:GeoJSON中的ZCTA5CE10字段是字符串格式的5位邮编,你需要确保数据框中的
zipcode和它格式完全一致,比如如果你的zipcode是整数类型,需要转成字符串并补全前导零:
# 把邮编转成5位字符串,避免0开头的邮编丢失前导零导致匹配失败 slow_agg['zipcode'] = slow_agg['zipcode'].astype(str).str.zfill(5)
之前isnan报错的解决
你之前传两列报isnan相关错误,是因为你选的第二列是字符串类型,folium的分级染色逻辑只支持数值类型的列,只要你把第二列换成数值类型(比如上面聚合得到的工单计数字段)就可以解决这个问题。
内容的提问来源于stack exchange,提问作者latestnight
相关产品推荐
相关产品推荐

