Ich war sehr verwirrt darüber, wie Python-Achsen definiert sind und ob sie sich auf die Zeilen oder Spalten eines DataFrames beziehen. Betrachten Sie den folgenden Code:
>>> df = pd.DataFrame([[1, 1, 1, 1], [2, 2, 2, 2], [3, 3, 3, 3]], columns=["col1", "col2", "col3", "col4"])
>>> df
col1 col2 col3 col4
0 1 1 1 1
1 2 2 2 2
2 3 3 3 3
Wenn wir also anrufen df.mean(axis=1)
, erhalten wir einen Mittelwert über die Zeilen:
>>> df.mean(axis=1)
0 1
1 2
2 3
Wenn wir jedoch aufrufen df.drop(name, axis=1)
, löschen wir tatsächlich eine Spalte , keine Zeile:
>>> df.drop("col4", axis=1)
col1 col2 col3
0 1 1 1
1 2 2 2
2 3 3 3
Kann mir jemand helfen zu verstehen, was unter einer "Achse" in pandas / numpy / scipy zu verstehen ist?
Eine Randnotiz DataFrame.mean
könnte einfach falsch definiert sein. In der Dokumentation heißt es, DataFrame.mean
dass axis=1
dies einen Mittelwert über die Spalten bedeuten soll, nicht über die Zeilen ...
mean
und die konsistent seindrop
. Es bedarf nichtlinearen Denkens, um zum tatsächlichen Verhalten zu gelangen.Antworten:
Es ist vielleicht am einfachsten, sich daran zu erinnern, dass 0 = unten und 1 = quer .
Das heisst:
axis=0
diese Option , um eine Methode in jeder Spalte oder auf die Zeilenbeschriftungen (den Index) anzuwenden.axis=1
diese Option , um eine Methode auf jede Zeile oder auf die Spaltenbeschriftungen anzuwenden.Hier ist ein Bild, das die Teile eines DataFrames zeigt, auf die sich jede Achse bezieht:
Es ist auch nützlich, sich daran zu erinnern, dass Pandas NumPys Gebrauch des Wortes folgt
axis
. Die Verwendung wird im NumPy- Glossar erläutert :In Bezug auf die Methode in der Frage
df.mean(axis=1)
scheint also richtig definiert zu sein. Es wird der Mittelwert der Einträge horizontal über Spalten , dh entlang jeder einzelnen Zeile, berechnet. Andererseitsdf.mean(axis=0)
wäre dies eine Operation, die vertikal nach unten über Reihen hinweg wirkt .df.drop(name, axis=1)
Bezieht sich in ähnlicher Weise auf eine Aktion für Spaltenbeschriftungen, da diese intuitiv über die horizontale Achse verlaufen. Wenn Sie angebenaxis=0
, wird die Methode stattdessen auf Zeilen angewendet .quelle
df.apply
eine Methode wie ähnlich sehendf.sum
.df.sum(axis=0)
Summiert beispielsweise jede Spalte des DataFrame. Ebenso können Sie schreibendf.apply(sum, axis=0)
, um genau den gleichen Vorgang auszuführen. Während die Operation tatsächlich auf jede Spalte im DataFrame angewendet wird, läuft die eigentliche Funktion entlang der Achse 0.MARGIN
(ähnlich wieaxis
in Pandas) Wert von "1" "Zeilen", was bedeutet, dass die Funktion auf jede Zeile angewendet wird , während die Ein größerer Wert von "2" bezieht sich auf "Spalten", was bedeutet, dass die Funktion auf jede Spalte angewendet wird .Ein anderer Weg zu erklären:
Über
df.drop
(Achse bedeutet die Position)Über
df.apply
(Achse bedeutet Richtung)quelle
Es gibt bereits richtige Antworten, aber ich gebe Ihnen ein anderes Beispiel mit> 2 Dimensionen.
Der Parameter
axis
bedeutet, dass die Achse geändert werden muss .Angenommen, es gibt einen Datenrahmen mit der Dimension axbxc .
df.mean(axis=1)
Gibt einen Datenrahmen mit der Abmessungsachse 1 xc zurück .df.drop("col4", axis=1)
Gibt einen Datenrahmen mit der Dimension ax (b-1) xc zurück .Bedeutet hier
axis=1
die zweite Achseb
, also wird derb
Wert in diesen Beispielen geändert.quelle
Es sollte allgemein bekannt sein, dass die Zeichenfolgenaliasnamen 'index' und 'column' anstelle der Ganzzahlen 0/1 verwendet werden können. Die Aliase sind viel expliziter und helfen mir, mich daran zu erinnern, wie die Berechnungen stattfinden. Ein weiterer Alias für 'Index' ist 'Zeilen' .
Wenn
axis='index'
es verwendet wird, finden die Berechnungen in den Spalten statt, was verwirrend ist. Aber ich erinnere mich, dass ich ein Ergebnis erhalten habe, das die gleiche Größe wie eine andere Zeile hat.Lassen Sie uns einige Daten auf dem Bildschirm anzeigen, um zu sehen, wovon ich spreche:
Wenn wir den Mittelwert aller Spalten nehmen wollen, erhalten wir
axis='index'
Folgendes:Das gleiche Ergebnis würde erzielt werden durch:
Verwenden Sie axis = 'column', um eine Operation von links nach rechts für die Zeilen zu verwenden. Ich erinnere mich daran, indem ich dachte, dass meinem DataFrame eine zusätzliche Spalte hinzugefügt werden könnte:
Das gleiche Ergebnis würde erzielt werden durch:
Fügen Sie eine neue Zeile mit Achse = 0 / Index / Zeilen hinzu
Verwenden Sie diese Ergebnisse, um zusätzliche Zeilen oder Spalten hinzuzufügen, um die Erklärung zu vervollständigen. Wenn Sie also axis = 0 / index / rows verwenden, erhalten Sie eine neue Zeile des DataFrame. Fügen wir eine Zeile hinzu:
Fügen Sie eine neue Spalte mit Achse = 1 / Spalten hinzu
Wenn Achse = 1 / Spalten ist, werden Daten erstellt, die leicht in eine eigene Spalte umgewandelt werden können:
Es scheint, dass Sie alle Aliase mit den folgenden privaten Variablen sehen können:
quelle
Wenn Achse = 'Zeilen' oder Achse = 0 ist, bedeutet dies, dass auf Elemente in Richtung der Zeilen von oben nach unten zugegriffen wird. Wenn Sie die Summe entlang der Achse = 0 anwenden, erhalten Sie Summen für jede Spalte.
Wenn Achse = 'Spalten' oder Achse = 1 ist, bedeutet dies, dass von links nach rechts auf Elemente in Richtung der Spalten zugegriffen wird. Wenn Sie die Summe entlang der Achse = 1 anwenden, erhalten Sie Summen für jede Zeile.
Immer noch verwirrend! Aber das oben Genannte macht es mir ein bisschen leichter.
quelle