702 Stimmen

Unterschied zwischen den Methoden map, applymap und apply in Pandas

Können Sie mir sagen, wann man diese Vektorisierungsmethoden mit einfachen Beispielen verwenden sollte?

Ich sehe, dass map eine Methode für Series ist, während die anderen Methoden für DataFrame sind. Ich war jedoch verwirrt über die Methoden apply und applymap. Warum haben wir zwei Methoden, um eine Funktion auf ein DataFrame anzuwenden? Wieder würden einfache Beispiele, die die Verwendung veranschaulichen, hilfreich sein!

715voto

jeremiahbuddha Punkte 8953

apply funktioniert auf Zeilen- / Spaltenbasis eines DataFrame
applymap funktioniert elementweise auf einem DataFrame
map funktioniert elementweise auf einer Series


Direkt aus Wes McKinneys Python for Data Analysis Buch, S. 132 (Ich empfehle dieses Buch sehr):

Eine weitere häufige Operation ist die Anwendung einer Funktion auf 1D-Arrays für jede Spalte oder Zeile. Die apply Methode des DataFrame macht genau dies:

In [116]: frame = DataFrame(np.random.randn(4, 3), columns=list('bde'), index=['Utah', 'Ohio', 'Texas', 'Oregon')

In [117]: frame
Out[117]: 
               b         d         e
Utah   -0.029638  1.081563  1.280300
Ohio    0.647747  0.831136 -1.549481
Texas   0.513416 -0.884417  0.195343
Oregon -0.485454 -0.477388 -0.309548

In [118]: f = lambda x: x.max() - x.min()

In [119]: frame.apply(f)
Out[119]: 
b    1.133201
d    1.965980
e    2.829781
dtype: float64

Viele der häufigsten Array-Statistiken (wie Summe und Mittelwert) sind DataFrame Methoden, daher ist die Verwendung von apply nicht notwendig.

Auch elementweise Python-Funktionen können verwendet werden. Angenommen, Sie möchten einen formatierten String aus jedem Gleitkommawert im Frame berechnen. Dies kann mit applymap erfolgen:

In [120]: format = lambda x: '%.2f' % x

In [121]: frame.applymap(format)
Out[121]: 
            b      d      e
Utah    -0.03   1.08   1.28
Ohio     0.65   0.83  -1.55
Texas    0.51  -0.88   0.20
Oregon  -0.49  -0.48  -0.31

Der Grund für den Namen applymap ist, dass Series eine map-Methode zum Anwenden einer elementweisen Funktion hat:

In [122]: frame['e'].map(format)
Out[122]: 
Utah       1.28
Ohio      -1.55
Texas      0.20
Oregon    -0.31
Name: e, dtype: object

338voto

cs95 Punkte 325143

Vergleich von map, applymap und apply: Kontext ist entscheidend

Die Hauptunterschiede sind:

Definition

  • map ist nur auf Series definiert
  • applymap ist nur auf DataFrames definiert
  • apply ist auf beiden definiert

Eingabeargument

  • map akzeptiert dict, Series oder callable
  • applymap und apply akzeptieren nur callable

Verhalten

  • map arbeitet elementweise für Series
  • applymap arbeitet elementweise für DataFrames
  • apply funktioniert auch elementweise, ist jedoch besser für komplexe Operationen und Aggregation geeignet. Das Verhalten und der Rückgabewert hängen von der Funktion ab.

Verwendungszweck (der wichtigste Unterschied)

  • map ist für das Zuordnen von Werten aus einem Bereich in einen anderen optimiert, z. B.,

    df['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 dient zum Anwenden einer beliebigen Funktion, die nicht vektorisiert werden kann, z. B.,

    df['sentences'].apply(nltk.sent_tokenize)

Siehe auch Wann sollte ich (nicht) pandas apply() in meinem Code verwenden? für einen Beitrag, den ich vor einiger Zeit über die geeignetsten Szenarien für die Verwendung von apply geschrieben habe. (Beachten Sie, dass es nicht viele gibt, aber ein paar— apply ist im Allgemeinen langsam.)


Zusammenfassend

map

applymap

apply

Auf Series definiert?

Ja

Nein

Ja

Auf DataFrame definiert?

Nein

Ja

Ja

Argument

dict, Series oder callable1

callable2

callable

Elementweise?

Ja

Ja

Ja

Aggregation?

Nein

Nein

Ja

Verwendungszweck

Transformation/Mapping3

Transformation

Komplexere Funktionen

Rückgabewert

Series

DataFrame

skalar, Series oder DataFrame4

Fußnoten

  1. map mappt bei Verwendung eines Dictionarys/Series Elemente basierend auf den Schlüsseln in diesem Dictionary/Series. Fehlende Werte werden als NaN im Ausgabewert aufgezeichnet.

  2. applymap wurde in neueren Versionen für einige Operationen optimiert. In einigen Fällen werden Sie feststellen, dass applymap etwas schneller als apply ist. Mein Vorschlag ist, beide zu testen und dasjenige zu verwenden, das besser funktioniert.

  3. map ist für elementweise Zuordnungen und Transformationen optimiert. Operationen, die Dictionarys oder Series beinhalten, ermöglichen es pandas, schnellere Code-Pfade für bessere Leistung zu verwenden.

  4. Series.apply gibt bei Aggregationsoperationen einen Skalar zurück, ansonsten eine Series. Gleiches gilt für DataFrame.apply. Beachten Sie, dass apply auch Schnellwege hat, wenn es mit bestimmten NumPy-Funktionen wie mean, sum, etc. aufgerufen wird.

96voto

MarredCheese Punkte 13018

Schnelle Zusammenfassung

  • DataFrame.apply arbeitet auf ganzen Zeilen oder Spalten gleichzeitig.

  • DataFrame.applymap, Series.apply und Series.map arbeiten auf einem Element zur gleichen Zeit.

Series.apply und Series.map sind ähnlich und oft austauschbar. Einige ihrer kleinen Unterschiede werden in osa's Antwort unten diskutiert.

45voto

Sergey Orshanskiy Punkte 6434

Zusätzlich zu den anderen Antworten gibt es in einer Series auch map und apply.

Apply kann aus einer Serie ein DataFrame machen; map hingegen wird einfach eine Serie in jede Zelle einer anderen Serie einfügen, was wahrscheinlich nicht das ist, was Sie wollen.

In [40]: p=pd.Series([1,2,3])
In [41]: p
Out[31]:
0    1
1    2
2    3
dtype: int64

In [42]: p.apply(lambda x: pd.Series([x, x]))
Out[42]: 
   0  1
0  1  1
1  2  2
2  3  3

In [43]: p.map(lambda x: pd.Series([x, x]))
Out[43]: 
0    0    1
1    1
dtype: int64
1    0    2
1    2
dtype: int64
2    0    3
1    3
dtype: int64
dtype: object

Auch wenn ich eine Funktion mit Nebenwirkungen hätte, wie z. B. "mit einem Webserver verbinden", würde ich wahrscheinlich apply nur für die Klarheit verwenden.

series.apply(download_file_for_every_element) 

Map kann nicht nur eine Funktion verwenden, sondern auch ein Dictionary oder eine andere Serie. Angenommen, Sie möchten Permutationen manipulieren.

Nehmen wir

1 2 3 4 5
2 1 4 5 3

Das Quadrat dieser Permutation ist

1 2 3 4 5
1 2 5 3 4

Sie können dies mit map berechnen. Bin mir nicht sicher, ob die Selbstanwendung dokumentiert ist, aber es funktioniert in 0.15.1.

In [39]: p=pd.Series([1,0,3,4,2])

In [40]: p.map(p)
Out[40]: 
0    0
1    1
2    4
3    2
4    3
dtype: int64

23voto

user2921752 Punkte 579

@jeremiahbuddha erwähnte, dass apply auf Zeilen/Spalten funktioniert, während applymap elementweise funktioniert. Aber anscheinend können Sie apply immer noch für eine elementweise Berechnung verwenden ....

frame.apply(np.sqrt)
Out[102]: 
               b         d         e
Utah         NaN  1.435159       NaN
Ohio    1.098164  0.510594  0.729748
Texas        NaN  0.456436  0.697337
Oregon  0.359079       NaN       NaN

frame.applymap(np.sqrt)
Out[103]: 
               b         d         e
Utah         NaN  1.435159       NaN
Ohio    1.098164  0.510594  0.729748
Texas        NaN  0.456436  0.697337
Oregon  0.359079       NaN       NaN

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X