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

如何优化Python中的该for循环?是否可采用Numpy数组等方案?

优化方案

核心思路:用Pandas向量化操作替代循环

Python逐行循环在Pandas里效率极低,数据量越大越明显。推荐用映射(map)+ 向量化计算的方式彻底规避循环,这是Pandas处理批量数据的最优实践。

具体实现代码

import numpy as np

# 1. 将Estatus表转为UUID到状态值的映射,设置索引后查找效率更高
estatus_map = Estatus.set_index('UUID')['Estatus'].astype(int)

# 2. 复制原表
MOV_10 = MOV_09.copy()

# 3. 批量获取UUID和UIID_2对应的状态值,缺失值自动填0
tempu = MOV_10['UUID'].map(estatus_map).fillna(0).astype(int)
tempw = MOV_10['UIID_2'].map(estatus_map).fillna(0).astype(int)

# 4. 用Numpy向量化条件判断,生成最终结果
MOV_10['Estatus'] = np.where(MOV_10['UIID_2'] == 'N/A', tempu, tempu * tempw)

效率提升原因

  • map是Pandas内置的向量化操作,底层用C实现,比Python循环快10~100倍;
  • 避免了循环中反复调用loc/iloc创建临时DataFrame的冗余操作;
  • np.where是Numpy的向量化条件判断,效率远高于循环内的if-else分支。

备选:用Merge关联实现

如果觉得映射不够直观,也可以用Merge批量关联字段:

import numpy as np

# 关联UUID对应的状态值
MOV_10 = MOV_10.merge(Estatus.rename(columns={'Estatus': 'Estatus_u'}), on='UUID', how='left')
# 关联UIID_2对应的状态值
MOV_10 = MOV_10.merge(Estatus.rename(columns={'Estatus': 'Estatus_w'}), left_on='UIID_2', right_on='UUID', how='left')

# 填充缺失值为0并转成整数类型
MOV_10[['Estatus_u', 'Estatus_w']] = MOV_10[['Estatus_u', 'Estatus_w']].fillna(0).astype(int)

# 计算最终结果
MOV_10['Estatus'] = np.where(MOV_10['UIID_2'] == 'N/A', MOV_10['Estatus_u'], MOV_10['Estatus_u'] * MOV_10['Estatus_w'])

# 清理临时列(可选)
MOV_10 = MOV_10.drop(['UUID_y', 'Estatus_u', 'Estatus_w'], axis=1).rename(columns={'UUID_x': 'UUID'})

关于Numpy的使用

上述方案已经用到了Numpy的np.where,如果处理超大规模数据,也可以直接转Numpy数组操作,但Pandas的map/merge已经足够高效,无需额外转换。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 04:45:36