2014-02-07 16 views
10

ich auf einem Pandas Dataframe-Objekt die Methode apply bin mit. Wenn mein DataFrame eine einzelne Spalte hat, scheint die angewandte Funktion zweimal aufgerufen zu werden. Die Fragen sind warum? Und, kann ich dieses Verhalten stoppen?Warum Pandas berechnen anwenden zweimal

Code:

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) 

Ausgang:

hello 
hello 

0 2.00 
1 4.00 
2 1.34 
3 2.68 

ich drucke 'Hallo' innerhalb der Funktion angewendet wird. Ich weiß, dass es zweimal angewendet wird, weil 'Hallo' zweimal gedruckt wird. Wenn ich zwei Spalten habe, druckt 'Hallo' dreimal. Noch mehr ist, wenn ich nur die Spalte 'Hallo' anrufe, die 4 Mal gedruckt wird.

Code:

print df.a.apply(mul2) 

Ausgang:

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

Antwort

4

Wahrscheinlich this issue bezogen. Mit groupby wird die angewandte Funktion eine zusätzliche Zeit genannt, um zu sehen, ob bestimmte Optimierungen durchgeführt werden können. Ich vermute, dass hier etwas Ähnliches passiert. Es sieht nicht so aus, es gibt eine Möglichkeit, um es im Moment (obwohl ich über die Quelle des Verhaltens falsch sein könnte Sie sehen). Gibt es einen Grund, warum Sie diesen zusätzlichen Anruf nicht benötigen?

Auch es viermal anrufen, wenn Sie auf die Spalte anwenden ist normal. Wenn Sie eine Spalte erhalten, erhalten Sie eine Serie, keinen DataFrame. apply auf einer Serie wendet die Funktion auf jedes Element . Da Ihre Spalte vier Elemente enthält, wird die Funktion vier Mal aufgerufen.

+0

Die Funktion, die ich verwende, ist rekursiv. Ich versuche zu vermeiden, dass die rekursive Berechnung mehr als nötig ausgeführt wird. Im Moment ist es kein Problem, aber es könnte sein. – piRSquared

3

Dieses Verhalten ist beabsichtigt, als Optimierung.

Siehe docs:

In der aktuellen Implementierung Anrufe gelten zweimal Func auf der ersten Spalte/Zeile, um zu entscheiden, ob sie einen schnellen oder langsamen Codepfad nehmen. Dies kann zu einem unerwarteten Verhalten führen, wenn func Nebenwirkungen hat, da sie zweimal für die erste Spalte/Zeile wirksam werden.

Verwandte Themen