Pandas数千列场景下优化循环映射操作的高效实现方法
优化方案
核心思路
原来的代码性能瓶颈主要来自三点:
- 循环内重复执行
set_index和to_dict操作,每次循环都要重建索引和字典,冗余开销极大 - Python层面的逐列循环,没有利用pandas的向量化计算能力
- 单列映射的操作本身效率远低于批量多列映射
优化方向是把所有操作改为pandas原生向量化操作,全程无Python层面循环,仅需一次索引预处理,批量完成所有列的映射求和。
优化后代码
import pandas as pd # 原有数据准备部分不变,仅修正了原代码中用内置关键字list做变量名的问题 sim = [['Matthew Stafford', 15, 13, 12], ['Dalvin Cook', 18, 16, 17], ['Daniel Jones', 17, 17, 15], ['Joe Mixon', 16, 15, 15]] col = ['Player', 1 , 2, 3] NFL_Sim = pd.DataFrame(sim, columns=col) player_list = [['Matthew Stafford', 'Dalvin Cook'], ['Daniel Jones', 'Joe Mixon']] col = ['QB', 'RB'] output_lines = pd.DataFrame(player_list, columns=col) # 以下是替换原循环的高效实现 # 1. 仅执行一次索引预处理 nfl_indexed = NFL_Sim.set_index('Player') # 2. 批量映射QB和RB对应的所有列数值 qb_vals = nfl_indexed.reindex(output_lines['QB']).reset_index(drop=True) rb_vals = nfl_indexed.reindex(output_lines['RB']).reset_index(drop=True) # 3. 批量求和后合并到结果表 output_lines = pd.concat([output_lines, qb_vals + rb_vals], axis=1) print(output_lines)
输出结果和原代码完全一致:
QB RB 1 2 3 0 Matthew Stafford Dalvin Cook 33 29 29 1 Daniel Jones Joe Mixon 33 32 30
性能说明
- 该方案所有计算均为pandas底层向量化实现,避免了Python层面的循环开销,面对数千列的场景性能提升可达数百倍
- 无需将DataFrame转为列表处理,pandas原生的批量操作效率远高于手动遍历列表的实现
内容的提问来源于stack exchange,提问作者Scott Woodhall
相关产品推荐
相关产品推荐

