Niejednoznaczność w definicji Pandy Dataframe / Numpy Array" axis"

Byłem bardzo zdezorientowany tym, jak definiowane są osie Pythona i czy odnoszą się one do wierszy lub kolumn ramki danych. Rozważ poniższy kod:

>>> 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

Więc jeśli wywołamy df.mean(axis=1), otrzymamy średnią w rzędach:

>>> df.mean(axis=1)
0    1
1    2
2    3

Jeśli jednak wywołamy df.drop(name, axis=1), to w rzeczywistości upuszczamy kolumnę , a nie wiersz:

>>> df.drop("col4", axis=1)
   col1  col2  col3
0     1     1     1
1     2     2     2
2     3     3     3

Czy ktoś może mi pomóc zrozumieć, co oznacza " oś " w pandas / numpy / scipy?

Uwaga boczna, DataFrame.mean może być źle zdefiniowana. Informatyka mówi w dokumentacji dla DataFrame.mean to axis=1 ma oznaczać średnicę nad kolumnami, a nie wierszami...

Author: Alex Riley, 2014-09-10

6 answers

Być może najprostszym jest zapamiętanie go jako 0=dół i 1=w poprzek.

Oznacza to:

  • użyj axis=0, Aby zastosować metodę w dół każdej kolumny lub do etykiet wierszy (indeks).
  • użyj axis=1, Aby zastosować metodę w każdym wierszu lub na etykietach kolumn.

Oto zdjęcie pokazujące części ramki danych, do których odnosi się każda oś:

Warto również pamiętać, że pandy podążają za używaniem słowa NumPy axis. Użycie jest wyjaśnione w słowniku terminów:

Osie są definiowane dla tablic z więcej niż jednym wymiarem. Tablica dwuwymiarowa ma dwie odpowiednie osie: pierwsza biegnąca pionowo w dół Przez wiersze (oś 0), a druga biegnąca poziomo przez kolumny (Oś 1). [moje podkreślenie ]

Tak więc, jeśli chodzi o metodę w pytaniu, df.mean(axis=1), wydaje się być poprawnie zdefiniowana. To trwa średnio wpisy poziomo w kolumnach , czyli wzdłuż każdego pojedynczego wiersza. Z drugiej strony, df.mean(axis=0) byłaby operacją działającą pionowo w dół przez rzędy.

Podobnie, df.drop(name, axis=1) odnosi się do akcji na etykietach kolumn, ponieważ intuicyjnie przechodzą przez poziomą oś. Podanie axis=0 spowoduje, że metoda będzie działać na wierszach.

 173
Author: Alex Riley,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-26 23:00:52

Inny sposób na Wyjaśnienie:

// Not realistic but ideal for understanding the axis parameter 
df = pd.DataFrame([[1, 1, 1, 1], [2, 2, 2, 2], [3, 3, 3, 3]],
                  columns=["idx1", "idx2", "idx3", "idx4"],
                  index=["idx1", "idx2", "idx3"]
                 )

---------------------------------------1
|          idx1  idx2  idx3  idx4
|    idx1     1     1     1     1
|    idx2     2     2     2     2
|    idx3     3     3     3     3
0

O df.drop (Oś oznacza pozycję)

A: I wanna remove idx3.
B: **Which one**? // typing while waiting response: df.drop("idx3",
A: The one which is on axis 1
B: OK then it is >> df.drop("idx3", axis=1)

// Result
---------------------------------------1
|          idx1  idx2     idx4
|    idx1     1     1     1
|    idx2     2     2     2
|    idx3     3     3     3
0

O df.apply (oś oznacza kierunek)

A: I wanna apply sum.
B: Which direction? // typing while waiting response: df.apply(lambda x: x.sum(),
A: The one which is on *parallel to axis 0*
B: OK then it is >> df.apply(lambda x: x.sum(), axis=0)

// Result
idx1    6
idx2    6
idx3    6
idx4    6
 10
Author: o0omycomputero0o,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-14 13:56:46

Są już poprawne odpowiedzi, ale podaję inny przykład z > 2 wymiarami.

Parametr axis oznacza oś do zmiany.
Na przykład, rozważmy, że istnieje ramka danych o wymiarze A x b X c.

  • df.mean(axis=1) zwraca ramkę danych z wymiarem A x 1 x c.
  • df.drop("col4", axis=1) zwraca ramkę danych o wymiarze A x (b-1) x c .

Tutaj axis=1 oznacza drugą oś, która jest b, więc b wartość zostanie zmieniona w tych przykładach.

 9
Author: jeongmin.cha,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-05-06 05:09:36

Powinno być szerzej znane, że aliasy łańcuchowe 'index' i 'columns' mogą być używane zamiast liczb całkowitych 0/1. Aliasy są znacznie bardziej wyraźne i pomagają mi zapamiętać, jak przebiegają obliczenia. Innym aliasem dla "index" jest "rows" .

Gdy używane jest axis='index', obliczenia następują po kolumnach, co jest mylące. Ale pamiętam to jako uzyskanie wyniku, który jest tego samego rozmiaru, co inny rząd.

Zdobądźmy jakieś dane na ekranie, aby zobaczyć, o czym mówię:

df = pd.DataFrame(np.random.rand(10, 4), columns=list('abcd'))
          a         b         c         d
0  0.990730  0.567822  0.318174  0.122410
1  0.144962  0.718574  0.580569  0.582278
2  0.477151  0.907692  0.186276  0.342724
3  0.561043  0.122771  0.206819  0.904330
4  0.427413  0.186807  0.870504  0.878632
5  0.795392  0.658958  0.666026  0.262191
6  0.831404  0.011082  0.299811  0.906880
7  0.749729  0.564900  0.181627  0.211961
8  0.528308  0.394107  0.734904  0.961356
9  0.120508  0.656848  0.055749  0.290897

Gdy chcemy wziąć średnią wszystkich kolumn, używamy axis='index', aby uzyskać następujące:

df.mean(axis='index')
a    0.562664
b    0.478956
c    0.410046
d    0.546366
dtype: float64

Ten sam wynik otrzymałby:

df.mean() # default is axis=0
df.mean(axis=0)
df.mean(axis='rows')

Aby użyć operacji od lewej do prawej na wierszach, użyj axis= 'columns'. Pamiętam to myśląc, że do mojego DataFrame można dodać dodatkową kolumnę:

df.mean(axis='columns')
0    0.499784
1    0.506596
2    0.478461
3    0.448741
4    0.590839
5    0.595642
6    0.512294
7    0.427054
8    0.654669
9    0.281000
dtype: float64

Ten sam wynik otrzymałby:

df.mean(axis=1)

Dodaj nowy wiersz z axis=0 / index / rows

Użyjmy tych wyników, aby dodać dodatkowe wiersze lub kolumny, aby zakończyć Wyjaśnienie. Tak więc, ilekroć używasz axis = 0 / index / rows, to tak, jakby uzyskać nowy wiersz ramki danych. Dodajmy wiersz:

df.append(df.mean(axis='rows'), ignore_index=True)

           a         b         c         d
0   0.990730  0.567822  0.318174  0.122410
1   0.144962  0.718574  0.580569  0.582278
2   0.477151  0.907692  0.186276  0.342724
3   0.561043  0.122771  0.206819  0.904330
4   0.427413  0.186807  0.870504  0.878632
5   0.795392  0.658958  0.666026  0.262191
6   0.831404  0.011082  0.299811  0.906880
7   0.749729  0.564900  0.181627  0.211961
8   0.528308  0.394107  0.734904  0.961356
9   0.120508  0.656848  0.055749  0.290897
10  0.562664  0.478956  0.410046  0.546366

Dodaj nową kolumnę z osią = 1 / kolumny

Podobnie, gdy axis=1 / columns utworzy dane, które można łatwo przekształcić we własną kolumnę:

df.assign(e=df.mean(axis='columns'))

          a         b         c         d         e
0  0.990730  0.567822  0.318174  0.122410  0.499784
1  0.144962  0.718574  0.580569  0.582278  0.506596
2  0.477151  0.907692  0.186276  0.342724  0.478461
3  0.561043  0.122771  0.206819  0.904330  0.448741
4  0.427413  0.186807  0.870504  0.878632  0.590839
5  0.795392  0.658958  0.666026  0.262191  0.595642
6  0.831404  0.011082  0.299811  0.906880  0.512294
7  0.749729  0.564900  0.181627  0.211961  0.427054
8  0.528308  0.394107  0.734904  0.961356  0.654669
9  0.120508  0.656848  0.055749  0.290897  0.281000

Wygląda na to, że możesz zobaczyć wszystkie aliasy z następującymi prywatnymi zmienne:

df._AXIS_ALIASES
{'rows': 0}

df._AXIS_NUMBERS
{'columns': 1, 'index': 0}

df._AXIS_NAMES
{0: 'index', 1: 'columns'}
 3
Author: Ted Petrou,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-03 20:30:26

Gdy axis = 'rows' lub axis=0, oznacza dostęp do elementów w kierunku wierszy, od góry do dołu. Jeśli zastosujemy sumę wzdłuż osi=0, da nam sumy każdej kolumny.

Gdy axis= 'columns' lub axis=1, oznacza dostęp do elementów w kierunku kolumn, od lewej do prawej. Jeśli zastosujemy sumę wzdłuż osi = 1, otrzymamy sumy każdego wiersza.

Wciąż mylące! Ale powyższe sprawia, że jest to trochę łatwiejsze dla mnie.

 1
Author: newbie,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-06-06 12:59:58

Wszystkie inne odpowiedzi są mylące. Oto jak o tym myślę:

axis=0: kształt wyniku jest poziomy (rząd)
axis=1: Kształt wyniku jest pionowy (kolumna)

Więc

  • df.drop(name, axis=1): rzuca kolumnę
  • df.mean(axis=1): oblicza kolumnę (wynik można dodać jako nową kolumnę)
 0
Author: AXO,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-09-18 07:15:05