python - 为什么 numpy 的 where 操作比 apply 函数快?

标签 python pandas numpy

在根据某些条件在 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"]))

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

另一件事是 pandasnumpy 执行更多的检查、索引对齐等。

在传递标量值时,您对 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/

相关文章:

Python 3 错误打印背景颜色问题

python 3.x : H2OFrame crash - Parsing Pandas dataframe

python - 如何使用 Python 减去数据框中每对行的日期并将其保存在 Excel 中

python - 生成随机 float ,总和为 1,具有最小值

python - 加速大都会--Python中的Hastings

python - Tinymce 编辑器未显示在 Django 模板中

python - 如何在多目录项目中正确导入 python 模块?

python - 如何通过字符串值和行中匹配的整数来过滤 Pandas 数据框?

python - 各种numpy随机函数之间的区别

python - 在 python 中构建基于 HTML5 的 GUI