如何优化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
相关产品推荐
相关产品推荐

