2014-02-07 3 views
10

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

Код:

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 

я печатаю 'привет' из функции применяется. Я знаю, что он применяется дважды, потому что «привет» печатается дважды. Более того, если бы у меня было два столбца, «привет» печатает 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 

ответ

4

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

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

+0

Функция, которую я использую, рекурсивна. Я пытаюсь избежать этого, делая рекурсивный расчет больше, чем нужно. Прямо сейчас, это не проблема, но это может быть. – piRSquared

3

Такое поведение предназначено, как оптимизация.

Смотрите docs:

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

Смежные вопросы