Nur für zusätzlichen Kontext und Intuition, hier ist ein explizites und konkretes Beispiel für die Unterschiede.
Annehmen, dass Sie die folgende Funktion haben. ( Diese Label-Funktion teilt willkürlich die Werte in 'Hoch' und 'Niedrig' auf, basierend auf dem Schwellenwert, den Sie als Parameter (x) bereitstellen.)
def label(element, x):
if element > x:
return 'Hoch'
else:
return 'Niedrig'
In diesem Beispiel nehmen wir an, dass unser DataFrame eine Spalte mit Zufallszahlen hat.
Wenn Sie versucht haben, die Label-Funktion mit map zu verwenden:
df['Spaltenname'].map(label, x = 0.8)
Werden Sie den folgenden Fehler erhalten:
TypeError: map() hat ein unerwartetes Schlüsselwortargument 'x'
Nehmen Sie nun dieselbe Funktion und verwenden Sie apply, dann werden Sie sehen, dass es funktioniert:
df['Spaltenname'].apply(label, x=0.8)
Series.apply() kann zusätzliche Argumente elementweise entgegennehmen, während die Methode Series.map() einen Fehler zurückgibt.
Wenn Sie nun versuchen, dieselbe Funktion gleichzeitig auf mehrere Spalten in Ihrem DataFrame anzuwenden, wird DataFrame.applymap() verwendet.
df[['Spaltenname','Spaltenname2','Spaltenname3','Spaltenname4']].applymap(label)
Zuletzt können Sie auch die apply() Methode auf einem DataFrame verwenden, aber die DataFrame.apply() Methode hat unterschiedliche Funktionen. Anstatt Funktionen elementweise anzuwenden, wendet die df.apply() Methode Funktionen entlang einer Achse an, entweder spaltenweise oder zeilenweise. Wenn wir eine Funktion erstellen, die mit df.apply() verwendet werden soll, richten wir sie so ein, dass sie eine Serie akzeptiert, am häufigsten eine Spalte.
Hier ist ein Beispiel:
df.apply(pd.value_counts)
Als wir die Funktion pd.value_counts auf das DataFrame angewendet haben, hat es die Wertezählungen für alle Spalten berechnet.
Beachten Sie, und das ist sehr wichtig, wenn wir die df.apply() Methode verwendet haben, um mehrere Spalten zu transformieren. Dies ist nur möglich, weil die Funktion pd.value_counts auf einer Serie arbeitet. Wenn wir versuchen würden, die df.apply() Methode zu verwenden, um eine Funktion anzuwenden, die elementweise an mehreren Spalten arbeitet, würden wir einen Fehler erhalten:
Zum Beispiel:
def label(element):
if element > 1:
return 'Hoch'
else:
return 'Niedrig'
df[['Spaltenname','Spaltenname2','Spaltenname3','Spaltenname4']].apply(label)
Dies wird den folgenden Fehler verursachen:
ValueError: ('Der Wahrheitswert einer Serie ist mehrdeutig. Verwenden Sie a.empty, a.bool(), a.item(), a.any() oder a.all().', u'bereits aufgetreten bei Index Economy')
Allgemein sollten wir die apply() Methode nur verwenden, wenn keine vektorisierte Funktion existiert. Denken Sie daran, dass Pandas die Vektorisierung verwendet, den Prozess, Operationen auf ganze Serien auf einmal anzuwenden, um die Leistung zu optimieren. Wenn wir die apply() Methode verwenden, durchlaufen wir eigentlich die Zeilen, daher kann eine vektorisierte Methode die Aufgabe schneller als die apply()-Methode erledigen.
Hier sind einige Beispiele für vektorisierte Funktionen, die bereits existieren, die Sie NICHT mit irgendwelchen Arten von apply/map Methoden neu erstellen möchten:
- Series.str.split() Teilt jedes Element in der Serie
- Series.str.strip() Entfernt Leerzeichen von jedem String in der Serie.
- Series.str.lower() Konvertiert Zeichenfolgen in der Serie in Kleinbuchstaben.
- Series.str.upper() Konvertiert Zeichenfolgen in der Serie in Großbuchstaben.
- Series.str.get() Ruft das ith Element jedes Elements in der Serie ab.
- Series.str.replace() Ersetzt ein Regex oder eine Zeichenkette in der Serie durch eine andere Zeichenfolge
- Series.str.cat() Verkettet Zeichenfolgen in einer Serie.
- Series.str.extract() Extrahiert Teilzeichenfolgen aus der Serie, die auf einem Regex-Muster basieren.