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
相关产品推荐
相关产品推荐

