Pandas实现向量化条件列赋值 替代低效apply逐行处理方法
Pandas 条件赋值向量化实现方案
当前场景属于典型的多条件分支赋值需求,逐行apply的处理效率极低,以下是三种可直接落地的向量化实现方案,运行速度比apply高数十到上百倍,数据量越大性能优势越明显:
方案1:numpy.where(最简洁,适配当前二分支互斥场景)
你给出的样例中v==1和w==1为互斥关系,直接用二分支判断即可:
import numpy as np df['z'] = np.where(df['v'] == 1, df['x'], df['y'])
逻辑说明:当第一个参数的条件成立时,取第二个参数的值,否则取第三个参数的值。
方案2:pandas loc 赋值(可读性高,易扩展)
如果后续可能新增更多条件,用loc逐条件赋值的方式更易维护:
# 先初始化z列,也可以根据需求设置默认值 df['z'] = 0 # 匹配v==1的行赋值为x列的值 df.loc[df['v'] == 1, 'z'] = df['x'] # 匹配w==1的行赋值为y列的值 df.loc[df['w'] == 1, 'z'] = df['y']
方案3:numpy.select(适配多分支复杂条件,扩展性最强)
如果后续规则扩展为多个判断分支,用np.select可以一次性配置所有条件和对应返回值:
import numpy as np # 按优先级配置条件列表 conditions = [ df['v'] == 1, df['w'] == 1 ] # 按条件顺序配置对应返回值 choices = [ df['x'], df['y'] ] # default参数为所有条件都不满足时的默认赋值 df['z'] = np.select(conditions, choices, default=0)
以上三种方案输出的结果和原apply实现完全一致,可根据后续业务扩展需求选择即可。
内容的提问来源于stack exchange,提问作者ajsp
相关产品推荐
相关产品推荐

