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

循环使用map创建DataFrame新列触发PerformanceWarning警告如何解决?

问题原因

在循环中逐列向payouts DataFrame插入新列时,pandas每次插入都会执行frame.insert操作,频繁调用会触发内存重分配,最终导致DataFrame内存碎片化,触发PerformanceWarning。

优化方案

核心思路是避免逐列插入,先批量处理所有需要新增的列,再一次性合并到原DataFrame中,同时提前提取重复计算的逻辑减少冗余开销。

优化后完整代码如下:

import pandas as pd

lineups = range(1, 5)
prizes = {'Rank':[1, 2, 3], 'Payout':[100, 50, 25]}
prizes = pd.DataFrame(prizes)
# 提前生成映射字典,避免循环内重复计算
payout_map = prizes.set_index('Rank')['Payout'].to_dict()

payouts = pd.DataFrame(lineups, columns=['Lineup'])
ranking = {'Lineup':[1, 2, 3, 4], 1:[1, 2 , 3, 4], 2:[2, 1, 4, 3], 3:[4, 1, 2, 3], 4:[1, 3, 4, 2]}
ranking = pd.DataFrame(ranking)

# 批量处理所有需要映射的列,一次性生成新列后合并
target_cols = range(1, 4)
new_cols = ranking[target_cols].replace(payout_map).fillna(-20)
payouts = pd.concat([payouts, new_cols], axis=1)

优化点说明

  • 提前提取排名到奖金的映射规则,避免循环内重复执行set_index、to_dict操作,减少不必要的计算开销
  • 用replace方法对所有目标列批量做值映射,替代逐列循环调用map的操作
  • 所有新列生成完成后,调用pd.concat一次性合并到原表中,完全规避了逐列插入导致的内存碎片化问题

如果不想修改原有循环逻辑,也可以在循环结束后主动执行一次payouts = payouts.copy()做内存整理,也可以消除警告,但性能不如批量处理的方案。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 21:06:03