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

Pandas分类地图绘制代码性能优化咨询(10万级数据)

优化Pandas多重循环地图绘制的性能方案

哇,四重嵌套循环处理10万条数据慢到原地踏步太正常了——这种写法相当于反复遍历整个DataFrame筛选数据,完全没利用Pandas的底层优化。给你几个针对性的优化方案,亲测能大幅提速:

1. 用groupby替代嵌套循环(核心优化)

你的循环本质是按vehicleId、day、time、season四个维度分组处理数据,Pandas的groupby是专门干这个的,内部用了更高效的哈希分组算法,比手动循环快N倍。而且它只会生成有数据的分组,自动跳过那些无数据的无效组合,直接砍掉不必要的循环开销。

替换后的代码:

# 按四个维度分组,自动过滤空组合
groups = a2.groupby(['vehicleId', 'day', 'time', 'season'])

# 遍历每个有效分组
for (vehicle, day, time, season), tempDf in groups:
    # 这里放你的地图绘制逻辑
    plot_your_map(tempDf)

2. 优化数据类型+设置复合索引

把分类列转成category类型,能大幅降低内存占用,同时加快分组/筛选速度;再把分组列设置为复合索引,让Pandas能更快定位数据(索引是有序结构,查找效率远高于普通列)。

# 将分类列转为category类型
for col in ['vehicleId', 'day', 'time', 'season']:
    a2[col] = a2[col].astype('category')

# 设置复合索引,进一步提升查找效率
a2 = a2.set_index(['vehicleId', 'day', 'time', 'season'])

# 基于索引分组,速度更快
groups = a2.groupby(level=[0,1,2,3])

3. 避免重复创建DataFrame

原来的循环里每次筛选都会生成新的tempDf,带来额外的内存复制开销。可以直接把绘图逻辑封装成函数,用groupby.apply批量处理,减少数据复制的时间:

def process_group(group):
    # 把你的绘图逻辑封装成函数
    plot_your_map(group)
    return None

# 批量处理所有分组
groups.apply(process_group)

4. 向量化替代逐行操作

如果绘图前有数据预处理(比如坐标转换、统计计算),绝对不要在循环里逐行处理!用Pandas的向量化函数(比如列运算、df.transform),把Python级别的循环换成C级别的运算,速度能提升几十倍。

❌ 不要写这种慢代码:

# 低效!逐行处理
for idx, row in tempDf.iterrows():
    tempDf.loc[idx, 'new_lon'] = row['lon'] * 1.1

✅ 改成向量化操作:

# 高效!整列一次性运算
tempDf['new_lon'] = tempDf['lon'] * 1.1

5. 并行处理分组(可选)

如果分组数量特别多,可以用并行库把任务拆到多个CPU核心上处理。比如用swifter简化并行操作:

import swifter

# 并行处理所有分组,npartitions设为你的CPU核心数
groups.swifter.apply_parallel(process_group, npartitions=4)

注意:如果绘图用了GUI后端(比如matplotlib的TkAgg),并行时可能会报错,建议先切换到非交互式后端:

import matplotlib
matplotlib.use('Agg')

内容的提问来源于stack exchange,提问作者syv

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 10:00:59