Ich habe einige Probleme mit der Pandas-Apply-Funktion, wenn mehrere Spalten mit dem folgenden Datenrahmen verwendet werden
df = DataFrame ({'a' : np.random.randn(6),
'b' : ['foo', 'bar'] * 3,
'c' : np.random.randn(6)})
und die folgende Funktion
def my_test(a, b):
return a % b
Wenn ich versuche, diese Funktion anzuwenden mit:
df['Value'] = df.apply(lambda row: my_test(row[a], row[c]), axis=1)
Ich erhalte die Fehlermeldung:
NameError: ("global name 'a' is not defined", u'occurred at index 0')
Ich verstehe diese Nachricht nicht, ich habe den Namen richtig definiert.
Ich würde mich über jede Hilfe zu diesem Thema sehr freuen
Aktualisieren
Danke für Ihre Hilfe. Ich habe in der Tat einige Syntaxfehler mit dem Code gemacht, der Index sollte '' gesetzt werden. Ich bekomme jedoch immer noch das gleiche Problem mit einer komplexeren Funktion wie:
def my_test(a):
cum_diff = 0
for ix in df.index():
cum_diff = cum_diff + (a - df['a'][ix])
return cum_diff
apply
so viel wie möglich zu verwenden. Wenn Sie nicht sicher sind, ob Sie es verwenden müssen, tun Sie es wahrscheinlich nicht. Ich empfehle einen Blick auf Wann sollte ich jemals pandas apply () in meinem Code verwenden wollen? .my_test(a)
betrifft, weiß die Funktion nicht, was esdf
ist, da sie nicht als Argument übergeben wurde (esdf
sei denn, es handelt sich um eine globale Frage, was eine schreckliche Praxis wäre). Sie müssen alle Werte, die Sie innerhalb einer Funktion benötigen, als Argumente übergeben (vorzugsweise in der Reihenfolge). Wie sonst würde die Funktion sonst wissen, woher siedf
kommt? Es ist auch eine schlechte Praxis, in einem mit globalen Variablen übersäten Namespace zu programmieren. Sie werden solche Fehler nicht abfangen.Antworten:
Scheint, als hättest du
''
deine Saite vergessen .Übrigens ist meiner Meinung nach der folgende Weg eleganter:
quelle
pythonista
aufgrund einiger Perspektiven, einschließlich dieser, wahrscheinlich nie als solche angesehen .Wenn Sie nur (Spalte a)% (Spalte b) berechnen möchten, müssen Sie dies nicht
apply
direkt tun:quelle
Angenommen, wir möchten eine Funktion add5 auf die Spalten 'a' und 'b' von DataFrame df anwenden
quelle
Alle oben genannten Vorschläge funktionieren, aber wenn Sie möchten, dass Ihre Berechnungen effizienter werden, sollten Sie die Anzahl der Vektoroperationen nutzen (wie hier ausgeführt) .
Beispiel 1: Schleifen mit
pandas.apply()
:Beispiel 2: Vektorisieren mit
pandas.apply()
:Beispiel 3: Vektorisieren mit Numpy-Arrays:
Das Vektorisieren mit Numpy-Arrays verbesserte die Geschwindigkeit um fast zwei Größenordnungen.
quelle
Dies ist das gleiche wie bei der vorherigen Lösung, aber ich habe die Funktion in df.apply selbst definiert:
quelle
Ich habe den Vergleich aller drei oben diskutierten gegeben.
Werte verwenden
139 µs ± 1,91 µs pro Schleife (Mittelwert ± Standardabweichung von 7 Läufen, jeweils 10000 Schleifen)
Ohne Werte
216 µs ± 1,86 µs pro Schleife (Mittelwert ± Standardabweichung von 7 Läufen, jeweils 1000 Schleifen)
Funktion anwenden
474 µs ± 5,07 µs pro Schleife (Mittelwert ± Standardabweichung von 7 Läufen, jeweils 1000 Schleifen)
quelle