Почему pandas применяет вычисление дважды

Я использую метод apply для объекта panda DataFrame. Когда мой DataFrame имеет один столбец, кажется, что прикладная функция вызывается дважды. Почему? И могу ли я остановить это поведение?

Код:

import pandas as pd

def mul2(x):
    print 'hello'
    return 2*x

df = pd.DataFrame({'a': [1,2,0.67,1.34]})

print df.apply(mul2)

Вывод:

hello
hello

0  2.00
1  4.00
2  1.34
3  2.68

Я печатаю 'hello' из используемой функции. Я знаю, что он применяется дважды, потому что "привет" печатается дважды. Более того, если у меня было два столбца, "привет" печатает 3 раза. Еще более важно то, что я вызываю, чтобы применить только к столбцам "привет" отпечатки 4 раза.

Код:

print df.a.apply(mul2)

Вывод:

hello
hello
hello
hello
0    2.00
1    4.00
2    1.34
3    2.68
Name: a, dtype: float64

Ответ 1

Вероятно, связанный с этот вопрос. С groupby прикладная функция называется одним дополнительным временем, чтобы увидеть, можно ли выполнить определенные оптимизации. Я бы предположил, что здесь происходит нечто подобное. На данный момент это не похоже на какой-либо способ (хотя я могу ошибаться в отношении источника поведения, которое вы видите). Есть ли причина, по которой вам это нужно, чтобы не делать дополнительный звонок.

Кроме того, вызов его четыре раза, когда вы применяете к столбцу, является нормальным. Когда вы получаете один столбец, вы получаете Серию, а не DataFrame. apply в серии применяет функцию к каждому элементу. Поскольку в вашей колонке есть четыре элемента, функция вызывается четыре раза.

Ответ 2

Это поведение предназначено для оптимизации.

Смотрите docs:

В текущей реализации применяются вызовы func дважды на первом столбца/строки, чтобы решить, может ли он принимать быстрый или медленный путь к коду. Это может привести к неожиданному поведению, если func имеет побочные эффекты, поскольку они вступает в силу дважды для первого столбца/строки.