在Folium/Pandas中循环创建PolyLines时Jupyter内核崩溃求助
问题:循环创建folium折线导致Jupyter内核崩溃
在JupyterLab中尝试通过循环从DataFrame创建多条folium折线,运行代码时内核总是崩溃终止。硬编码坐标时代码能正常运行,但读取DataFrame列值就出问题。
原代码:
m = folium.Map(location=[VstBreitengrad, VstLängengrad], max_zoom=20, zoom_start=5) for index, row in dfFilter.iterrows(): Breitengrad = row["Breitengrad_x"] Längengrad = row["Längengrad_x"] coordinates = [ [Breitengrad, Längengrad], [20, 20] ] folium.PolyLine( locations=coordinates, color="#FF0000", weight=5, ).add_to(m) m
硬编码可运行的示例:
Breitengrad = 50 #row["Breitengrad_x"] Längengrad = 20 #row["Längengrad_x"]
可能原因及解决方案
1. 数据类型不匹配
Breitengrad_x和Längengrad_x列可能是字符串或其他非数值类型,导致folium处理坐标时触发异常,进而引发内核崩溃。
解决方法:转换列类型并剔除空值
import pandas as pd # 转换为数值类型,无法转换的设为NaN dfFilter['Breitengrad_x'] = pd.to_numeric(dfFilter['Breitengrad_x'], errors='coerce') dfFilter['Längengrad_x'] = pd.to_numeric(dfFilter['Längengrad_x'], errors='coerce') # 删除含空值的行 dfFilter = dfFilter.dropna(subset=['Breitengrad_x', 'Längengrad_x'])
2. DataFrame行数过多
如果dfFilter包含大量行(如几万+),循环创建并添加PolyLine会快速耗尽内存,导致内核终止。
解决方法:优化循环或分批次处理
- 改用
apply批量生成坐标列表,减少iterrows()的开销:
# 批量生成所有折线的坐标对 coords_list = dfFilter.apply( lambda row: [[row['Breitengrad_x'], row['Längengrad_x']], [20, 20]], axis=1 ).tolist() # 批量添加折线 for coords in coords_list: folium.PolyLine(locations=coords, color="#FF0000", weight=5).add_to(m)
- 若数据量极大,可分块处理,每添加固定数量的折线后释放临时变量:
chunk_size = 1000 for i in range(0, len(dfFilter), chunk_size): chunk = dfFilter.iloc[i:i+chunk_size] coords_chunk = chunk.apply( lambda row: [[row['Breitengrad_x'], row['Längengrad_x']], [20, 20]], axis=1 ).tolist() for coords in coords_chunk: folium.PolyLine(locations=coords, color="#FF0000", weight=5).add_to(m)
3. 存在异常坐标值
列中可能包含NaN、无穷大或超出合理范围(纬度-9090,经度-180180)的数值,导致folium处理出错。
解决方法:过滤异常值
# 保留坐标在合理范围内的行 dfFilter = dfFilter[ (dfFilter['Breitengrad_x'].between(-90, 90)) & (dfFilter['Längengrad_x'].between(-180, 180)) ]
内容的提问来源于stack exchange,提问作者Andi3579
相关产品推荐
相关产品推荐

