如何使用Numpy Vectorize替代pandas apply函数实现条件判断
问题解答
np.vectorize 写法修正
你代码报错的核心原因是函数入参和实际传入的参数类型不匹配:你定义的copy_filter预期接收DataFrame行对象、读取DAYS字段判断,但调用a(df['DAYS'])时传入的是DAYS列的单个数值,对数值执行['DAYS']索引操作必然报错。
修正后的代码如下:
# 函数改为接收单个DAYS数值作为入参 def copy_filter(days): return days < 365 a = np.vectorize(copy_filter, otypes = [bool]) df['bool_vectorize'] = a(df['DAYS'])
注意:np.vectorize 本质是简化代码的语法糖,并不会带来性能提升,内部依然是循环遍历元素执行函数,运行速度和apply基本一致,甚至可能更慢,生产环境不推荐用这种方式实现简单逻辑。
其他适用的场景优化技术
- 最简最高效方案:直接利用pandas的向量化比较操作,不需要调用任何额外函数,代码如下:
该操作直接在numpy数组层执行计算,是所有实现中性能最高、代码最简洁的方式,完全可以替代你写的df['bool'] = df['DAYS'] < 365apply和np.where版本。 - 多条件判断场景:如果后续逻辑扩展为多区间、多条件判断,可以用
np.select或者pd.cut实现向量化计算,性能远高于逐行判断。 - 复杂自定义逻辑场景:如果判断逻辑非常复杂无法用现有向量化函数实现,可以用
numba库的@njit装饰器编译自定义函数,运行速度可以接近C语言级别。
内容的提问来源于stack exchange,提问作者user13925399
相关产品推荐
相关产品推荐

