Jupyter/Colab使用folium添加地图标记触发RecursionError求助
问题根因
这个递归报错和递归深度阈值设置没有任何关系,本质是两处代码逻辑错误触发了folium内部的无限循环遍历:
- 第一处是Marker创建的代码逻辑写反、括号配对错误:你写的
icon = folium.Icon(color= color).add_to(stl_crime_street),会先把图标对象直接加到地图上,而add_to()方法的返回值是传入的父对象也就是地图实例stl_crime_street,相当于给Marker的icon参数传了整个地图对象。folium内部做元素结构扁平化遍历的时候,会顺着引用无限循环:读取Marker的icon属性→拿到整个地图→遍历地图下的所有子元素→读到当前正在创建的Marker→再读Marker的icon→又拿到整个地图,直接触发无限递归导致栈溢出。 - 第二处是
map_data构造时的拼接逻辑错误:你直接用pd.concat按行索引做内连接拼接,但df[['address']]用的是原始DataFrame的行索引,PB_index是重置过的从0开始的连续索引,两者索引不对齐,拼出来的结果里地址、经纬度、计数三个字段完全错位,就算不报错点位信息也完全对不上。
修复方案
1. 修正点位添加的代码逻辑
不要给Icon单独调用add_to,正确流程是先组装好Marker的所有参数(包括Icon实例),再把整个Marker加到地图上,修正后的循环代码如下:
for i in range(10): lat = map_data['LATLNG'].iloc[i][0] long = map_data['LATLNG'].iloc[i][1] location = map_data['address'].iloc[i] count = map_data['ValueCount'].iloc[i] if count > 150: color = 'red' elif count >= 100: color = 'orange' else: color = 'blue' popup_text = """ Location: {}<br> Peace Disruptions : {}<br>""".format(location, count) # 正确写法:icon参数传Icon实例,Marker创建完成后再add到地图 folium.Marker( location=[lat, long], popup=popup_text, icon=folium.Icon(color=color) ).add_to(stl_crime_street)
2. 修正map_data的拼接逻辑
不要直接靠行索引拼接,先把原始df的地址和经纬度做去重对应,再和计数结果按字段合并,保证三个字段属于同一点位,修正后的构造代码如下:
# 统计每个经纬度的事件频次并重置列名 unique_locations = df['LATLNG'].value_counts().reset_index() unique_locations.columns = ['LATLNG', 'ValueCount'] # 提取每个经纬度对应的唯一地址,避免索引错位 location_addr = df[['LATLNG', 'address']].drop_duplicates(subset=['LATLNG']) # 按LATLNG字段做匹配合并,而非按行索引硬拼 map_data = pd.merge(unique_locations, location_addr, on='LATLNG', how='left') # 验证前10条数据正确性 map_data_head = map_data[:10] print(map_data.head())
注意:不要靠调高递归深度阈值解决这类问题,只要是逻辑错误导致的无限递归,不管阈值设多高最终都会触发栈溢出。
内容的提问来源于stack exchange,提问作者jacksojo
相关产品推荐
相关产品推荐

