web-dev-qa-db-de.com

Was bedeutet Achse in Pandas?

Hier ist mein Code zum Generieren eines Datenrahmens:

import pandas as pd
import numpy as np

dff = pd.DataFrame(np.random.randn(1,2),columns=list('AB'))

dann bekam ich das Datenfeld:

+------------+---------+--------+
|            |  A      |  B     |
+------------+---------+---------
|      0     | 0.626386| 1.52325|
+------------+---------+--------+

Wenn ich den Befehl eingebe:

dff.mean(axis=1)

Ich habe :

0    1.074821
dtype: float64

Entsprechend der Referenz von Pandas steht Achse = 1 für Spalten und ich erwarte, dass das Ergebnis des Befehls ist

A    0.626386
B    1.523255
dtype: float64

Hier ist meine Frage: Was bedeutet Achse in Pandas?

188
jerry_sjtu

Es gibt die Achse entlang der die Mittelwerte berechnet werden. Standardmäßig axis=0. Dies ist konsistent mit der Verwendung von numpy.mean, wenn axis angegeben ist explizit (in numpy.mean, Achse == Keiner, der den Mittelwert über das abgeflachte Array berechnet), wobei axis=0 entlang der rows (nämlich , index in Pandas) und axis=1 entlang der Spalten. Zur besseren Übersichtlichkeit können Sie axis='index' (anstelle von axis=0) oder axis='columns' (anstelle von axis=1) angeben.

+------------+---------+--------+
|            |  A      |  B     |
+------------+---------+---------
|      0     | 0.626386| 1.52325|----axis=1----->
+------------+---------+--------+
             |         |
             | axis=0  |
             ↓         ↓
280
zhangxaochen

Diese Antworten helfen zwar, dies zu erklären, aber es ist für einen Nicht-Programmierer (z. B. jemand, der Python zum ersten Mal im Rahmen von Data Science-Kursen lernt) immer noch nicht absolut intuitiv. Ich finde immer noch die Verwendung der Begriffe "entlang" oder "für jeden" bezüglich Zeilen und Spalten als verwirrend.

Was für mich mehr Sinn macht, ist es so zu sagen:

  • Achse 0 wirkt auf alle REIHEN in jeder SPALTE 
  • Achse 1 wirkt auf alle COLUMNS in jeder Reihe

Ein Mittelwert auf Achse 0 ist also der Mittelwert aller Zeilen in jeder Spalte, und ein Mittelwert auf Achse 1 ist der Mittelwert aller Spalten in jeder Zeile.

Letztlich sagt dies dasselbe wie @zhangxaochen und @Michael, aber auf eine Art, die für mich leichter zu verinnerlichen ist.

47
Ken Wallace

axis bezieht sich auf die Dimension des Arrays, im Fall von pd.DataFrames axis=0 ist die nach unten zeigende Dimension und axis=1 die nach rechts zeigende. 

Beispiel: Denken Sie an ein ndarray mit der Form (3,5,7)

a = np.ones((3,5,7))

a ist ein dreidimensionales ndarray, d. H. Es hat 3 Achsen ("Achsen" ist ein Plural von "Achse"). Die Konfiguration von a sieht aus wie 3 Brotscheiben, wobei jede Scheibe die Dimension 5-by-7 hat. a[0,:,:] bezieht sich auf das 0-te Slice, a[1,:,:] bezieht sich auf das 1. Slice usw.

a.sum(axis=0) wendet sum() entlang der 0-ten Achse von a an. Sie fügen alle Scheiben hinzu und erhalten am Ende eine Form (5,7).

a.sum(axis=0) ist äquivalent zu 

b = np.zeros((5,7))
for i in range(5):
    for j in range(7):
        b[i,j] += a[:,i,j].sum()

b und a.sum(axis=0) sehen beide so aus

array([[ 3.,  3.,  3.,  3.,  3.,  3.,  3.],
       [ 3.,  3.,  3.,  3.,  3.,  3.,  3.],
       [ 3.,  3.,  3.,  3.,  3.,  3.,  3.],
       [ 3.,  3.,  3.,  3.,  3.,  3.,  3.],
       [ 3.,  3.,  3.,  3.,  3.,  3.,  3.]])

In einem pd.DataFrame arbeiten Achsen auf dieselbe Weise wie in numpy.arrays: axis=0 wendet sum() oder eine andere Reduktionsfunktion für jede Spalte an. 

N.B. In @ zhangxaochens Antwort finde ich die Ausdrücke "entlang der Zeilen" und "entlang der Spalten" etwas verwirrend. axis=0 sollte sich auf "entlang jeder Spalte" und axis=1 "in jeder Zeile" beziehen.

26
Safak Ozkan

Der einfachste Weg für mich zu verstehen ist, darüber zu sprechen, ob Sie für jede Spalte (axis = 0) oder für jede Zeile (axis = 1) eine Statistik berechnen. Wenn Sie eine Statistik berechnen, sagen Sie einen Mittelwert, mit axis = 0 erhalten Sie diese Statistik für jede Spalte. Wenn also jede Beobachtung eine Zeile ist und sich jede Variable in einer Spalte befindet, erhalten Sie den Mittelwert jeder Variablen. Wenn Sie axis = 1 setzen, berechnen Sie Ihre Statistik für jede Zeile. In unserem Beispiel würden Sie den Mittelwert für jede Beobachtung aller Ihrer Variablen erhalten (vielleicht möchten Sie den Durchschnitt der zugehörigen Messwerte).

axis = 0: nach Spalte = spaltenweise = entlang der Zeilen

axis = 1: zeilenweise = zeilenweise entlang der Spalten

20
Michael

Lassen Sie sich visualisieren (werde mich immer daran erinnern), enter image description here

In Pandas:

  1. achse = 0 bedeutet entlang "Indizes". Es ist eine zeilenweise Operation

Angenommen, zur Ausführung der concat () - Operation für dataframe1 & dataframe2.... Nehmen wir dataframe1 & nimm die erste Zeile von dataframe1 und platzieren sie in den neuen DF Dieser Prozess wird bis zum Ende von Dataframe1 erreicht. Dann führen wir den gleichen Vorgang für dataframe2 aus.

Stapeln von dataframe2 auf dataframe1 oder umgekehrt.

E. macht einen Stapel Bücher auf einem Tisch oder Boden

  1. achse = 1 bedeutet entlang "Spalten". Es ist eine spaltenweise Operation.

Angenommen, zur Ausführung der concat () - Operation für dataframe1 & dataframe2.... Werden wir die erste complete -Spalte (aka 1. Serie) von dataframe1 herausnehmen und in den neuen DF einfügen und halten neben (seitwärts), müssen wir diesen Vorgang wiederholen, bis alle Spalten fertig sind. Dann wiederholen wir den gleichen Vorgang für dataframe2 . Im Wesentlichen stacking dataframe2 seitwärts.

E. Bücher in einem Bücherregal anordnen.

18
anu

Der Designer von Pandas, Wes McKinney, hat sich intensiv mit Finanzdaten beschäftigt. Stellen Sie sich Spalten als Aktiennamen und Index als Tagespreise vor. Sie können dann erraten, wie das Standardverhalten (d. H. axis=0) in Bezug auf diese Finanzdaten ist. axis=1 kann einfach als "die andere Richtung" gedacht werden.

Beispielsweise setzen die Statistikfunktionen wie mean(), sum(), describe(), count() alle auf Spalten, da es sinnvoller ist, sie für jede Aktie auszuführen. sort_index(by=) ist standardmäßig auf Spalte eingestellt. fillna(method='ffill') wird entlang der Spalte gefüllt, da es sich um denselben Bestand handelt. dropna() rudert standardmäßig, da Sie wahrscheinlich nur den Preis an diesem Tag verwerfen möchten, anstatt alle Kurse dieser Aktie wegzuwerfen. 

In ähnlicher Weise bezieht sich die Indizierung der eckigen Klammern auf die Spalten, da es üblicher ist, eine Aktie auszuwählen, anstatt einen Tag auszuwählen.

8
nos

Achse im Hinblick auf die Programmierung ist die Position in der Form Tupel. Hier ist ein Beispiel:

import numpy as np

a=np.arange(120).reshape(2,3,4,5)

a.shape
Out[3]: (2, 3, 4, 5)

np.sum(a,axis=0).shape
Out[4]: (3, 4, 5)

np.sum(a,axis=1).shape
Out[5]: (2, 4, 5)

np.sum(a,axis=2).shape
Out[6]: (2, 3, 5)

np.sum(a,axis=3).shape
Out[7]: (2, 3, 4)

Der Mittelwert auf der Achse bewirkt, dass diese Bemaßung entfernt wird.

In Bezug auf die ursprüngliche Frage ist die Dff-Form (1,2). Bei Verwendung von Achse = 1 wird die Form in (1,) geändert.

6
Mark09

Dies basiert auf der Antwort von @ Safak .. Die beste Möglichkeit, die Achsen in Pandas/Numpy zu verstehen, ist die Erstellung eines 3D-Arrays und die Überprüfung des Ergebnisses der Summenfunktion entlang der 3 verschiedenen Achsen.

 a = np.ones((3,5,7))

ein wird sein:

    array([[[1., 1., 1., 1., 1., 1., 1.],
    [1., 1., 1., 1., 1., 1., 1.],
    [1., 1., 1., 1., 1., 1., 1.],
    [1., 1., 1., 1., 1., 1., 1.],
    [1., 1., 1., 1., 1., 1., 1.]],

   [[1., 1., 1., 1., 1., 1., 1.],
    [1., 1., 1., 1., 1., 1., 1.],
    [1., 1., 1., 1., 1., 1., 1.],
    [1., 1., 1., 1., 1., 1., 1.],
    [1., 1., 1., 1., 1., 1., 1.]],

   [[1., 1., 1., 1., 1., 1., 1.],
    [1., 1., 1., 1., 1., 1., 1.],
    [1., 1., 1., 1., 1., 1., 1.],
    [1., 1., 1., 1., 1., 1., 1.],
    [1., 1., 1., 1., 1., 1., 1.]]])

Überprüfen Sie nun die Summe der Elemente des Arrays entlang der Achsen:

 x0 = np.sum(a,axis=0)
 x1 = np.sum(a,axis=1)
 x2 = np.sum(a,axis=2)

erhalten Sie die folgenden Ergebnisse:

   x0 :
   array([[3., 3., 3., 3., 3., 3., 3.],
        [3., 3., 3., 3., 3., 3., 3.],
        [3., 3., 3., 3., 3., 3., 3.],
        [3., 3., 3., 3., 3., 3., 3.],
        [3., 3., 3., 3., 3., 3., 3.]])

   x1 : 
   array([[5., 5., 5., 5., 5., 5., 5.],
   [5., 5., 5., 5., 5., 5., 5.],
   [5., 5., 5., 5., 5., 5., 5.]])

  x2 :
   array([[7., 7., 7., 7., 7.],
        [7., 7., 7., 7., 7.],
        [7., 7., 7., 7., 7.]])
1
missnomer

achse = 0 bedeutet nach unten Achse = 1 bedeutet von links nach rechts

sums[key] = lang_sets[key].iloc[:,1:].sum(axis=0)

In diesem Beispiel wird die Summe aller Daten in Spalte == genommen.

1
HeadAndTail

Das Problem bei der korrekten Verwendung von axis= Besteht in der Verwendung für zwei Hauptfälle:

  1. Zum Berechnen eines akkumulierten Wertes oder Umordnen (z. B. Sortieren) von Daten.
  2. Für Manipulieren ("Spielen" mit) Entitäten (z. B. Datenrahmen).

Die Hauptidee hinter dieser Antwort ist, dass wir zur Vermeidung von Verwechslungen entweder eine Zahl oder eine Name zur Angabe der jeweiligen Achse wählen, was auch immer klarer, intuitiver und beschreibender ist.

Pandas basiert auf NumPy, das auf Mathematik basiert, insbesondere auf n-dimensionalen Matrizen. Hier ist ein Bild für die allgemeine Verwendung von Achsennamen in der Mathematik im dreidimensionalen Raum:

enter image description here Dieses Bild dient nur zum Speichern der Achsen-Ordnungszahlen:

  • 0 Für die x-Achse,
  • 1 Für die y-Achse und
  • 2 Für die Z-Achse.

Die z-Achse gilt nur für Paneele; für dataframes beschränken wir uns auf die grün gefärbte, zweidimensionale Grundebene mit x-Achse (0, vertikal) und y-Achse (1, horizontal).

enter image description here Alles für Zahlen als mögliche Werte des Parameters axis=.

Die Namen der Achsen sind 'index' (Sie können den Alias ​​'rows' Verwenden) und 'columns', Und für diese Erklärung it Die Beziehung zwischen diesen Namen und Ordnungszahlen ist NICHT wichtig (von Achsen), da jeder weiß, was die Wörter "Zeilen" und "Spalten" Mittelwert (und jeder hier - Ich nehme an - weiß, was das Wort "Index" in pandas bedeutet).

nd jetzt meine Empfehlung:

  1. Wenn Sie einen akkumulierten Wert berechnen möchten, können Sie ihn aus Werten berechnen, die sich entlang Achse (oder entlang Achse 1) befinden - verwenden Sie axis=0 (Oder axis=1).

    Wenn Sie Werte neu anordnen möchten, verwenden Sie die Achsennummer der Achse. entlang derer befinden sich Daten für die Neuanordnung (z. B. für sortieren).

  2. Wenn Sie manipulieren (z. B. verketten) Entitäten (z. B. Datenrahmen) - verwenden Sie axis='index' (Synonym: axis='rows') Oder axis='columns' Zur Angabe der resultierenden Änderung - Index (Zeilen) bzw. Spalten.
    (Für Verketten erhalten Sie entweder einen längeren Index (= mehr Zeilen) oder mehr Spalten bzw..)

1
MarianD

Schauen wir uns die Tabelle aus dem Wiki an. Dies ist eine IWF-Schätzung des BIP von 2010 bis 2019 für die Top-Ten-Länder .  enter image description here

1. Achse 1 wirkt für jede Zeile auf alle Spalten
Wenn Sie das durchschnittliche (durchschnittliche) BIP für jedes Land im Jahrzehnt (2010-2019) berechnen möchten, müssen Sie df.mean(axis=1) tun. Wenn Sie beispielsweise das mittlere BIP der Vereinigten Staaten von 2010 bis 2019 berechnen möchten, df.loc['United States','2010':'2019'].mean(axis=1)

2. Achse 0 wirkt für jede Spalte in allen Zeilen
Wenn ich für jedes Land das durchschnittliche (durchschnittliche) BIP für jedes Jahr berechnen möchte, müssen Sie df.mean(axis=0) tun. Wenn Sie beispielsweise das durchschnittliche BIP des Jahres 2015 für die Vereinigten Staaten, China, Japan, Deutschland und Indien berechnen möchten, df.loc['United States':'India','2015'].mean(axis=0)

Hinweis: Der obige Code funktioniert nur, wenn Sie die Spalte "Land (oder abhängiges Gebiet)" als Index mit der set_index-Methode festlegen. 

0
Sumit Pokhrel

Ich verstehe das so:

Sagen Sie, wenn für Ihre Operation in einem Datenrahmen von links nach rechts/rechts nach links verfahren werden muss, verbinden Sie scheinbar Spalten, d. H. Sie arbeiten mit verschiedenen Spalten .. _. Dies ist axis = 1

Beispiel

df = pd.DataFrame(np.arange(12).reshape(3,4),columns=['A', 'B', 'C', 'D'])
print(df)
   A  B   C   D
0  0  1   2   3
1  4  5   6   7
2  8  9  10  11 

df.mean(axis=1)

0    1.5
1    5.5
2    9.5
dtype: float64

df.drop(['A','B'],axis=1,inplace=True)

    C   D
0   2   3
1   6   7
2  10  11

Zu beachten ist hier, dass wir mit Spalten arbeiten

Wenn für Ihre Operation in einem Datenrahmen von oben nach unten/unten nach oben verfahren werden muss, fügen Sie Zeilen zusammen. Dies ist axis = 0.

0
Abhishek Raj

eine der einfachen Möglichkeiten, sich Achse 1 (Spalten) und Achse 0 (Zeilen) zu merken, ist die Ausgabe, die Sie erwarten. Wenn Sie für jede Zeile eine Ausgabe erwarten, verwenden Sie axis = 'columns'. Wenn Sie dagegen für jede Spalte eine Ausgabe wünschen, verwenden Sie axis = 'rows'.

0
yosemite_k

Ich denke: Achse = n, wobei n = 0, 1 usw. bedeutet, dass die Matrix entlang dieser Achse zusammengeklappt ist. Wenn Sie also in einer 2D-Matrix entlang 0 (Zeilen) kollabieren, bearbeiten Sie wirklich jeweils eine Spalte. Ähnlich für Matrizen höherer Ordnung.

Dies ist nicht der normale Verweis auf eine Dimension in einer Matrix, wobei 0 -> Zeile und 1 -> Spalte steht. Ähnlich für andere Dimensionen in einem Array mit N Dimensionen.

0
Nkrish

Ich denke, es gibt einen anderen Weg, es zu verstehen.

Wenn wir für ein np.array Spalten entfernen möchten, verwenden wir axis = 1; Wenn wir Zeilen entfernen möchten, verwenden wir axis = 0.

np.mean(np.array(np.ones(shape=(3,5,10))),axis = 0).shape # (5,10)
np.mean(np.array(np.ones(shape=(3,5,10))),axis = 1).shape # (3,10)
np.mean(np.array(np.ones(shape=(3,5,10))),axis = (0,1)).shape # (10,)

Für Pandas-Objekte steht axis = 0 für zeilenweise Operationen und axis = 1 für spaltenweise Operationen. Dies unterscheidet sich von numpy per Definition. Wir können Definitionen aus numpy.doc und pandas.doc überprüfen.

0
Travis

Ich bin ein Neuling bei Pandas. Aber so verstehe ich die Achse in Pandas:


Achse Konstante Variierend Richtung


0 Spaltenzeile abwärts | 


1 Reihenspalte nach rechts ->


Um den Mittelwert einer Spalte zu berechnen, sollte diese bestimmte Spalte konstant sein, aber die Zeilen unter dieser Spalte können sich ändern (variierend) , also ist Achse = 0.

Um den Mittelwert einer Zeile zu berechnen, ist diese bestimmte Zeile konstant , sie kann jedoch verschiedene Spalten (variierend) , Achse = 1 durchlaufen.

0