首页 > 解决方案 > 为什么 numpy 的 where 操作比 apply 函数快?

问题描述

在基于某些条件在 pandas 数据框中创建新列时,numpy 的 where 方法在执行时间方面优于 apply 方法,为什么会这样?

例如:

df["log2FC"] = df.apply(lambda x: np.log2(x["C2Mean"]/x["C1Mean"]) if x["C1Mean"]> 0 else np.log2(x["C2Mean"]), axis=1)

df["log2FC"] = np.where(df["C1Mean"]==0,
                        np.log2(df["C2Mean"]), 
                        np.log2(df["C2Mean"]/df["C1Mean"]))

标签: pythonpandasnumpy

解决方案


此调用apply是逐行迭代:

df["log2FC"] = df.apply(lambda x: np.log2(x["C2Mean"]/x["C1Mean"]) if x["C1Mean"]> 0 else np.log2(x["C2Mean"]), axis=1)

apply只是循环的语法糖,你通过了,axis=1所以它是按行的。

你的另一个片段

df["log2FC"] = np.where(df["C1Mean"]==0,
                        np.log2(df["C2Mean"]), 
                        np.log2(df["C2Mean"]/df["C1Mean"]))

作用于整个列,因此它是矢量化的。

另一件事是pandas执行比numpy.

np.log2当您传递标量值时,您的调用在这种情况下毫无意义:

 np.log2(x["C2Mean"]/x["C1Mean"])

在性能方面,它与调用相同math.log2

解释为什么 numpy 明显更快或什么是矢量化超出了这个问题的范围。你可以看到:什么是矢量化?.

这里最重要的是 numpy 可以并且将使用用 C 或 Fortran 编写的外部库,这些库本质上比 python 快。


推荐阅读