Этот вызов 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.