如何在pandas中使用isin()生成计算列 替代低效for循环
Pandas计算列高效实现方案
你当前使用的逐行for循环属于Python层面的迭代操作,在数据量较大时运行效率极低,替换为Pandas内置的矢量化操作即可大幅提升运行速度,性能可提升数十到上千倍。
推荐实现方式(一行完成逻辑)
使用np.where结合isin的矢量化判断方案,简洁高效:
import numpy as np # 注意调整列名:你需求中指定的ID列是PRODUCT_ID,原有循环中写的是PRODUCT_CODE,按实际表结构修改即可 portfoy['PRODUCT_TYPE'] = np.where(portfoy['PRODUCT_ID'].isin([3, 5, 8]), 'old', 'new')
逻辑说明
Series.isin([3,5,8])会批量判断每一行的PRODUCT_ID是否在目标列表中,返回布尔类型的数组np.where(判断条件, 满足条件返回值, 不满足条件返回值)会批量给新列赋值,全程为底层C实现,无Python层面的循环
替代实现方案(适合规则更复杂的场景)
如果后续映射规则有扩展调整,也可以用字典映射的方式实现:
# 定义ID到类型的映射规则 id_map = {3: 'old', 5: 'old', 8: 'old'} portfoy['PRODUCT_TYPE'] = portfoy['PRODUCT_ID'].map(id_map).fillna('new')
注意事项
- 不需要提前初始化
PRODUCT_TYPE列为空值,以上两种方案都会直接生成完整的新列 - 请确认你表中的实际列名,如果ID列名是
PRODUCT_CODE就把代码里的PRODUCT_ID替换掉即可
内容的提问来源于stack exchange,提问作者Mehmet Soydam
相关产品推荐
相关产品推荐

