在根据某些条件在 pandas dataframe 中创建新列时,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"]))
最佳答案
对 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 明显更快或什么是矢量化超出了这个问题的范围。你可以看到这个:What is vectorization? .
这里的本质是 numpy 可以并且将会使用用 C 或 Fortran 编写的外部库,它们本质上比 python 更快。
关于python - 为什么 numpy 的 where 操作比 apply 函数快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56109846/