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

Python中循环嵌套判断处理大数据Frame过慢,求高效优化方案

优化Pandas大数据框处理速度:将指定行的列值取反

问题场景

现有结构如下的DataFrame:

A      B
0    Plus   632
1    Min    24
2    Min    99
3    Plus   0.15
...  ...    ...

需求:对A列值以'Min'开头的行,将对应B列的值乘以-1。

原实现代码(性能极差):

for i in range(1, len(df)):
    if df.loc[i, 'A'].startswith('Min'):
        df.loc[i, 'B'] = df.loc[i, 'B'] * -1

该代码处理大数据框时耗时呈指数增长:5万行15秒、10万行30秒、20万行160秒、30万行500秒,无法处理70万行的DataFrame。

提速方案

所有方案均基于向量化运算,利用Pandas/Numpy的C级底层实现替代Python循环,性能提升几个数量级:

方案1:布尔索引批量赋值(最通用)

df.loc[df['A'].str.startswith('Min'), 'B'] *= -1

直接通过布尔索引定位所有符合条件的行,批量修改B列值,无需逐行遍历,70万行数据可在几秒内完成。

方案2:numpy.where条件替换

import numpy as np
df['B'] = np.where(df['A'].str.startswith('Min'), df['B'] * -1, df['B'])

利用numpy的向量化条件判断,一次性生成新的B列值,效率与方案1相当,适合需要生成新列而非修改原列的场景。

方案3:映射转换(适用于A列取值仅为Plus/Min)

如果A列只有'Plus'和'Min'两种固定值,可进一步简化:

df['B'] *= df['A'].map({'Plus': 1, 'Min': -1})

通过映射将A列转换为1/-1的乘数,直接与B列相乘,避免字符串匹配开销,性能最优。

原代码慢的原因

Python循环逐行使用.loc访问时,每次操作都会触发Pandas的索引校验、数据定位等额外开销,且Python循环本身执行效率远低于C级的向量化运算,数据量越大,开销累积越严重,最终导致耗时指数级增长。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 14:02:07