如何优化Pandas DataFrame中行元素位置交换的低效代码?
优化Pandas大型DataFrame行交换操作的效率
你的代码处理大型DataFrame时效率低下的核心原因是用Python循环逐行遍历+频繁使用.at修改单个元素——这完全违背了Pandas的向量化设计初衷,Python循环在处理十万级以上数据时会产生巨大的性能开销。
优化方案:使用向量化布尔索引批量处理
Pandas的优势在于批量操作,我们可以先筛选出需要交换的行,再对目标列进行批量交换,全程避免逐行循环:
import pandas as pd def main(): gamestatistics = pd.read_csv('CvCaggregation.csv') # 生成需要交换行的布尔掩码 swap_mask = gamestatistics['championname'] > gamestatistics['enemyname'] # 批量交换championname与enemyname temp_name = gamestatistics.loc[swap_mask, 'championname'].copy() gamestatistics.loc[swap_mask, 'championname'] = gamestatistics.loc[swap_mask, 'enemyname'] gamestatistics.loc[swap_mask, 'enemyname'] = temp_name # 批量交换position与enemyposition temp_pos = gamestatistics.loc[swap_mask, 'position'].copy() gamestatistics.loc[swap_mask, 'position'] = gamestatistics.loc[swap_mask, 'enemyposition'] gamestatistics.loc[swap_mask, 'enemyposition'] = temp_pos # 批量交换championwinrate与enemywinrate temp_winrate = gamestatistics.loc[swap_mask, 'championwinrate'].copy() gamestatistics.loc[swap_mask, 'championwinrate'] = gamestatistics.loc[swap_mask, 'enemywinrate'] gamestatistics.loc[swap_mask, 'enemywinrate'] = temp_winrate # 可选:统计交换行数(替代逐行打印) print(f"Adjusted {swap_mask.sum()} rows") return gamestatistics
为什么这个方案更快?
- 向量化操作:所有交换逻辑都是基于布尔索引的批量处理,底层由C语言实现,比Python循环快几十到几百倍;
- 避免频繁IO:原代码每次
.at修改都会触发DataFrame的内部更新,批量操作只需要几次更新即可完成; - 减少冗余操作:去掉了逐行打印的开销(如果需要统计交换行数,用
swap_mask.sum()一次计算即可)。
示例说明
比如你的示例中,当Yasuo > Akali条件成立时,swap_mask会标记该行,代码会自动交换对应行的championname/enemyname、position/enemyposition、championwinrate/enemywinrate列值,逻辑和原代码完全一致,但效率提升显著。
内容的提问来源于stack exchange,提问作者Jack
相关产品推荐
相关产品推荐

