Почему 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 имеет побочные эффекты, поскольку они вступает в силу дважды для первого столбца/строки.