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

在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 09:08:13