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...
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.
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
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.
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'}
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.
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ę)
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