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

Python多层For循环性能优化替代方案咨询

优化DataFrame嵌套循环匹配的方案

当前你用6组嵌套iterrows()循环实现条件匹配并填充列,虽然功能正常,但逐行迭代的方式在500行DataFrame下会产生大量重复计算(单组循环就有500*500=25万次遍历,6组累计150万次),这是性能瓶颈的核心原因。下面用pandas的向量化操作替代循环,能大幅提升效率:

优化思路

  • 先预处理opf,提前筛选出符合固定条件的子集,避免重复遍历整个数据集
  • 利用pandas的merge、布尔索引或多列isin实现批量判断,替代低效的逐行循环

优化后的代码

# 预处理opf的各个条件子集,一次性筛选避免重复计算
opf_sub1 = opf[(opf['H'] == 'C') & (opf['I'] == 'OFC')][['E', 'F', 'G']]
opf_sub2 = opf[(opf['N'] == 'V') & (opf['O'] == 'OFV')][['K', 'L', 'M']]
opf_sub3 = opf[(opf['T'] == 'C') & (opf['U'] == 'OFV')][['Q', 'R', 'S']]
opf_sub4 = opf[(opf['W'] == 'V') & (opf['W1'] == 'OFC')][['X', 'Y', 'Z']]
opf_sub5 = opf[(opf['DD'] == 'V') & (opf['EE'] == 'OFC')][['AA', 'BB', 'CC']]
opf_sub6 = opf[opf['C'] != 0][['A', 'B']]

# 给calculos的目标列初始化(若未提前设置)
calculos[['J', 'P', 'V', 'W2', 'FF', 'D']] = 0

# 1. 填充J列:匹配E/F/G且符合opf_sub1的条件
calculos['J'] = calculos.merge(
    opf_sub1, on=['E', 'F', 'G'], how='left', indicator=True
)['_merge'].eq('both').astype(int)

# 2. 填充P列:匹配K/L/M且符合opf_sub2的条件
calculos['P'] = calculos.merge(
    opf_sub2, on=['K', 'L', 'M'], how='left', indicator=True
)['_merge'].eq('both').astype(int)

# 3. 填充V列:匹配Q/R/S且符合opf_sub3的条件
calculos['V'] = calculos.merge(
    opf_sub3, on=['Q', 'R', 'S'], how='left', indicator=True
)['_merge'].eq('both').astype(int)

# 4. 填充W2列:匹配X/Y/Z且符合opf_sub4的条件
calculos['W2'] = calculos.merge(
    opf_sub4, on=['X', 'Y', 'Z'], how='left', indicator=True
)['_merge'].eq('both').astype(int)

# 5. 填充FF列:匹配AA/BB/CC且符合opf_sub5的条件
calculos['FF'] = calculos.merge(
    opf_sub5, on=['AA', 'BB', 'CC'], how='left', indicator=True
)['_merge'].eq('both').astype(int)

# 6. 填充D列:匹配A/B且opf的C≠0
calculos['D'] = calculos.merge(
    opf_sub6, on=['A', 'B'], how='left', indicator=True
)['_merge'].eq('both').astype(int)

补充说明

  • 向量化操作是pandas的核心优势,底层用C实现,比逐行循环快几十到上百倍
  • 预处理子集后,后续的merge只处理符合条件的行,进一步减少计算量
  • 若担心merge产生临时DataFrame占用内存,也可以用元组isin的方式,以J列为例:
    match_keys = opf_sub1.apply(tuple, axis=1)
    calculos['J'] = calculos[['E', 'F', 'G']].apply(tuple, axis=1).isin(match_keys).astype(int)
    
    这种方式内存占用更低,适合更大数据集的场景

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 11:55:27