循环使用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
相关产品推荐
相关产品推荐

