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
相关产品推荐
相关产品推荐

