Können Sie mir anhand grundlegender Beispiele sagen, wann ich diese Vektorisierungsmethoden verwenden soll?
Ich sehe, dass dies map
eine Series
Methode ist, während der Rest DataFrame
Methoden sind. Ich war verwirrt über apply
und applymap
Methoden. Warum gibt es zwei Methoden zum Anwenden einer Funktion auf einen DataFrame? Auch hier wären einfache Beispiele, die die Verwendung veranschaulichen, großartig!
python
pandas
dataframe
vectorization
Marillion
quelle
quelle
Antworten:
Direkt aus Wes McKinneys Python for Data Analysis- Buch, S. 132 (Ich habe dieses Buch sehr empfohlen):
Zusammenfassend lässt sich
apply
sagen, dass ein DataFrame zeilen- / spaltenbasiert, ein DataFrameapplymap
elementweise undmap
eine Serie elementweise arbeitet.quelle
func
zulambda x: [func(y) for y in x]
, und die Anwendung spaltenweise)map
undapplymap
beide Elemente funktionieren, würde ich eine einzelne Methode (entwedermap
oderapplymap
) erwarten, die sowohl für eine Serie als auch für einen DataFrame funktioniert. Wahrscheinlich gibt es andere Designüberlegungen, und Wes McKinney hat beschlossen, zwei verschiedene Methoden zu entwickeln.applymap
mit dergroupby
Funktion von Pandas zusammenzuarbeiten?Vergleicht man
map
,applymap
und : Context Mattersap
ply
Erster großer Unterschied: DEFINITION
map
ist NUR für Serien definiertapplymap
wird NUR in DataFrames definiertapply
ist auf BEIDEN definiertZweiter großer Unterschied: INPUT ARGUMENT
map
akzeptiertdict
sSeries
, oder aufrufbarapplymap
undapply
nur Callables akzeptierenDritter Hauptunterschied: VERHALTEN
map
ist elementweise für Serieapplymap
ist elementweise für DataFramesapply
funktioniert auch elementweise, eignet sich jedoch für komplexere Operationen und Aggregationen. Das Verhalten und der Rückgabewert hängen von der Funktion ab.Vierter Hauptunterschied (der wichtigste): USE CASE
map
gemeint ist , für die Zuordnung von Werten von einer Domäne zu einer anderen, so dass für die Leistung optimiert ist (beispielsweisedf['A'].map({1:'a', 2:'b', 3:'c'})
)applymap
ist gut für elementweise Transformationen über mehrere Zeilen / Spalten (z. B.df[['A', 'B', 'C']].applymap(str.strip)
)apply
ist für jede Funktion der Anwendung , die nicht vektorisiert werden kann ( zum Beispieldf['sentences'].apply(nltk.sent_tokenize)
)Zusammenfassen
quelle
Diese Antworten enthalten großartige Informationen, aber ich füge meine eigenen hinzu, um klar zusammenzufassen, welche Methoden in Bezug auf Arrays und Elemente funktionieren. jeremiahbuddha tat dies meistens, erwähnte aber nicht Series.apply. Ich habe nicht den Repräsentanten, um einen Kommentar abzugeben.
DataFrame.apply
arbeitet mit ganzen Zeilen oder Spalten gleichzeitig.DataFrame.applymap
,Series.apply
UndSeries.map
auf einem Element zu einem Zeitpunkt betrieben werden .Es gibt viele Überschneidungen zwischen den Funktionen von
Series.apply
undSeries.map
, was bedeutet, dass beide in den meisten Fällen funktionieren. Sie haben jedoch einige geringfügige Unterschiede, von denen einige in der Antwort von osa erörtert wurden.quelle
Neben den anderen Antworten
Series
gibt es in a auch Map und Apply .Apply kann aus einer Reihe einen DataFrame machen . Map fügt jedoch nur eine Reihe in jede Zelle einer anderen Reihe ein, was wahrscheinlich nicht das ist, was Sie wollen.
Auch wenn ich eine Funktion mit Nebenwirkungen hätte, wie "Verbindung zu einem Webserver herstellen", würde ich sie wahrscheinlich
apply
nur aus Gründen der Klarheit verwenden.Map
kann nicht nur eine Funktion, sondern auch ein Wörterbuch oder eine andere Reihe verwenden. Angenommen, Sie möchten Permutationen manipulieren .Nehmen
Das Quadrat dieser Permutation ist
Sie können es mit berechnen
map
. Ich bin nicht sicher, ob die Selbstanwendung dokumentiert ist, aber sie funktioniert in0.15.1
.quelle
@jeremiahbuddha erwähnte, dass apply für Zeilen / Spalten funktioniert, während applymap elementweise funktioniert. Aber es scheint, dass Sie Apply für elementweise Berechnungen verwenden können ....
quelle
Ich wollte nur darauf hinweisen, als ich ein bisschen damit zu kämpfen hatte
Dies ändert den Datenrahmen selbst nicht, muss neu zugewiesen werden
quelle
df = modified_df
oder durch Setzen eines Flags geändertinplace=True
. Auch der Datenrahmen ändert sich, wenn Sie einen Datenrahmen als Referenz an eine Funktion übergeben und die Funktion den Datenrahmen ändert.ix
oder.where
usw. Sie sind sich nicht sicher, wofür die vollständige Erklärung ist, wenn Sie sie neu zuweisen müssen und wenn nicht.Wahrscheinlich einfachste Erklärung für den Unterschied zwischen apply und applymap:
apply verwendet die gesamte Spalte als Parameter und weist das Ergebnis dieser Spalte zu
applymap verwendet den separaten Zellenwert als Parameter und weist das Ergebnis dieser Zelle zurück.
NB Wenn apply den einzelnen Wert zurückgibt, haben Sie diesen Wert nach der Zuweisung anstelle der Spalte und schließlich nur eine Zeile anstelle der Matrix.
quelle
Mein Verständnis:
Aus funktionaler Sicht:
Wenn die Funktion Variablen enthält, die innerhalb einer Spalte / Zeile verglichen werden müssen, verwenden Sie
apply
.zB :
lambda x: x.max()-x.mean()
.Wenn die Funktion auf jedes Element angewendet werden soll:
1> Wenn sich eine Spalte / Zeile befindet, verwenden Sie
apply
2> Wenn auf den gesamten Datenrahmen angewendet, verwenden Sie
applymap
quelle
Basierend auf der Antwort von cs95
map
ist NUR für Serien definiertapplymap
wird NUR in DataFrames definiertapply
ist auf BEIDEN definiertgib ein Paar Beispiele
quelle
FOMO:
Das folgende Beispiel zeigt
apply
undapplymap
angewendet auf aDataFrame
.map
Funktion ist etwas, das Sie nur auf Serien anwenden. Sie können sich nichtmap
auf DataFrame bewerben .Das ist daran zu erinnern ist , dass
apply
tun allesapplymap
kann, aberapply
hat eXtra Optionen.Die X-Faktor-Optionen sind:
axis
undresult_type
woresult_type
funktioniert nur wannaxis=1
(für Spalten).Als Nebenbemerkung
map
sollte die Serienfunktion nicht mit der Python-map
Funktion verwechselt werden.Der erste wird auf Serien angewendet, um die Werte abzubilden, und der zweite auf jedes Element einer Iterierbarkeit.
Verwechseln Sie die Datenrahmenmethode nicht
apply
mit der groupby-apply
Methode.quelle