虽然根据某种条件在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"]))
答案 0 :(得分:4)
对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快。