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

如何优化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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 03:35:34