Co oznacza oś w pandach?

269

Oto mój kod do generowania ramki danych:

import pandas as pd
import numpy as np

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

potem dostałem ramkę danych:

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

Kiedy wpisuję polecenie:

dff.mean(axis=1)

Mam :

0    1.074821
dtype: float64

Zgodnie z odniesieniem do pand, oś = 1 oznacza kolumny i oczekuję, że wynik polecenia będzie

A    0.626386
B    1.523255
dtype: float64

Oto moje pytanie: co oznacza oś w pandach?

jerry_sjtu
źródło

Odpowiedzi:

382

Określa oś, wzdłuż której obliczane są średnie. Domyślnie axis=0. Jest to zgodne z numpy.meanużyciem, gdy axisjest jawnie określone (w numpy.mean, oś == Brak domyślnie, co oblicza średnią wartość ponad spłaszczoną tablicę), w której axis=0wzdłuż wierszy (mianowicie indeks w pandach) i axis=1wzdłuż kolumn . Dla większej przejrzystości można wybrać opcję axis='index'(zamiast axis=0) lub axis='columns'(zamiast axis=1).

+------------+---------+--------+
|            |  A      |  B     |
+------------+---------+---------
|      0     | 0.626386| 1.52325|----axis=1----->
+------------+---------+--------+
             |         |
             | axis=0  |
                      
zhangxaochen
źródło
164
Zwykle oś = 0 mówi się „pod kątem kolumny” (a oś = 1 „pod względem wiersza”), myślę, że „wzdłuż rzędów” jest mylące. (Ładne „pic” :) :)
Andy Hayden
11
@AndyHayden tak, ale może oba są nieco mylące dla tych, którzy pierwszy raz się z tym
spotkają
43
Ponadto przyczyną axis=0wskazującą na agregację wzdłuż wierszy i axis=1wskazującą na agregację wzdłuż kolumn jest sposób indeksowania do ramki danych. In df.iloc[row, column], rowznajduje się w pozycji indeksu 0 i columnznajduje się w pozycji indeksu 1. Numpy uogólnia to na N wymiarów, co oznacza, że ​​myślenie w kategoriach osi, że zapada się agregacja, zaczyna mieć więcej sensu niż „w rzędzie” lub „w kolumnie” „.
Tom Q.
11
Nadal czuję się zagubiony. Jeśli to zrobię, kolumnadf.drop("A", axis = 1) A zostanie usunięta. To nie jest „wzdłuż rzędu” ani „pod względem rzędu”, ale upuszczanie kolumny A.
ytu
5
@ytu axis=0oznacza każdy wiersz zbiorczo, możemy jedynie manipulować DataFrame między wierszami zamiast wewnętrznych. axis=1oznacza każdą kolumnę jako zbiorczą, możemy manipulować tylko między kolumnami DataFrame zamiast wewnętrznymi. Więc jeśli użyjesz df.drop("A", axis = 1), spowoduje to usunięcie całej kolumny.
Belter,
106

Odpowiedzi te pomagają to wyjaśnić, ale wciąż nie są całkowicie intuicyjne dla osób niebędących programistami (tj. Dla kogoś takiego jak ja, który uczy się języka Python po raz pierwszy w kontekście zajęć z nauki o danych). Nadal uważam, że używanie terminów „wzdłuż” lub „dla każdego” wrt do wierszy i kolumn jest mylące.

Bardziej sensowne jest dla mnie powiedzenie tego w ten sposób:

  • Oś 0 będzie działać na wszystkie RZĘDY w każdej KOLUMNIE
  • Oś 1 będzie działać na wszystkie KOLUMNY w każdym rzędzie

Tak więc średnia na osi 0 będzie średnią wszystkich wierszy w każdej kolumnie, a średnia na osi 1 będzie średnią wszystkich kolumn w każdym rzędzie.

Ostatecznie mówi to to samo, co @zhangxaochen i @Michael, ale w sposób łatwiejszy do internalizacji.

Ken Wallace
źródło
Myślę, że zamieszanie wynika ze złożoności każdego tak zwanego „aktu”. df.dropna (oś = 0) najpierw sprawdzi wszystkie KOLUMNY w każdym RZĘDZIE, a następnie usunie te RZĘDY z wartością zerową. Oś mówi o ostatnim kroku, ale nasz mózg skoncentruje się na pierwszej części.
Shawn Chen
69

Wizualizujmy (zawsze będziesz pamiętać), wprowadź opis zdjęcia tutaj

W pandach:

  1. oś = 0 oznacza wzdłuż „indeksów”. To operacja rzędowa .

Załóżmy, że aby wykonać operację concat () na ramce danych 1 i ramce danych 2, weźmiemy ramkę danych 1 i wyjmujemy 1 wiersz z ramki danych 1 i umieszczamy w nowym DF, a następnie wyjmujemy kolejny wiersz z ramki danych 1 i umieszczamy w nowym DF, powtarzamy ten proces do dochodzimy do dolnej krawędzi ramki danych 1. Następnie wykonujemy ten sam proces dla dataframe2.

Zasadniczo układanie ramek danych 2 na ramce danych 1 lub odwrotnie.

Na przykład robienie stosu książek na stole lub podłodze

  1. oś = 1 oznacza wzdłuż „kolumn”. To operacja kolumnowa.

Załóżmy, że aby wykonać operację concat () na ramce danych 1 i ramce danych 2, wyjmujemy pierwszą pełną kolumnę (zwaną także pierwszą serią) ramki danych 1 i umieszczamy w nowym DF, a następnie wyjmujemy drugą kolumnę ramki danych 1 i trzymamy się obok niej (bokiem) ) , musimy powtarzać tę operację, aż wszystkie kolumny zostaną zakończone. Następnie powtarzamy ten sam proces na ramce danych2. Zasadniczo układanie ramek danych 2 w bok.

Np. Układanie książek na półce.

Co więcej, ponieważ tablice są lepszymi reprezentacjami do reprezentowania zagnieżdżonej struktury n-wymiarowej w porównaniu do macierzy! dlatego poniżej możesz lepiej zobrazować, w jaki sposób oś odgrywa ważną rolę, gdy uogólniasz na więcej niż jeden wymiar. Ponadto możesz faktycznie drukować / pisać / rysować / wizualizować dowolną tablicę n-dim, ale pisanie lub wizualizowanie jej w postaci macierzy (3-dim) jest niemożliwe na papierze o więcej niż 3-wymiarach.

wprowadź opis zdjęcia tutaj

Anu
źródło
6
Myślę, że ta odpowiedź jest właściwa. Musisz to zwizualizować. oś = 0 (lub oś = „rzędy” to oś pozioma. oś = 1 (lub oś = „kolumny”) to oś pionowa. Aby przejść dalej, jeśli używasz metody upuszczania pandy, usuń kolumny lub wiersze, jeśli określisz oś = 1. usuniesz kolumny. Jeśli określisz oś = 0, usuniesz wiersze ze zbioru danych. Więc jeśli mamy trochę ramek danych pand w zmiennej df: df.drop (0, oś = 0) usuniesz cały pierwszy wiersz z zestawu danych df.drop („stopnie”, oś = 1) usunie kolumnę „stopnie” z zestawu danych Mam nadzieję, że to wyjaśni to nieco bardziej ...
Roboblob
3
@Roboblob - wciąż mylący. df.drop (n, oś = 1) działa na kolumnę. Dlaczego df.mean (oś = 1) nie podejmuje działań wobec kolumny?
matty,
@ matty, po pierwsze! miej brudne ręce !, to takie proste. Dla odniesienia, drop & mean , oś = 1 jest taka sama dla obu, proszę zadać nowe pytanie, jeśli nie rozumiesz czegoś w swoim przykładzie!
Anu
2
@anu - brudne ręce? Nie musimy zaśmiecać SO powielonymi pytaniami. Jestem pewien, że jedną lub więcej odpowiedzi na tej stronie można wyjaśnić, aby zmniejszyć zamieszanie. Zrobiłbym to sam, gdybym mógł, ale na razie wiem tylko, jak z nich korzystać. Rozumiem, której osi użyć, aby uzyskać potrzebne dane. Pozostaje jednak niejasne, dlaczego średnia () i drop () mają wrażenie, że wpływają na przeciwne osie.
matty
2
Obawiam się, że ta odpowiedź jest niezwykle myląca. Mówisz o działaniu w rzędach jako o osi = 0, ale rysujesz czerwone strzałki w dół kolumn. Mówisz o osi = 1 działającej na kolumny, ale rysujesz strzałki przechodzące przez rząd. Ktokolwiek wymyślił ten system, nie przemyślał go zbyt dobrze.
rocksNwaves
33

axisodnosi się do wymiaru tablicy, w przypadku pd.DataFrames axis=0jest to wymiar skierowany w dół i axis=1ten, który wskazuje w prawo.

Przykład: Pomyśl ndarrayo kształcie z (3,5,7).

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

ajest trójwymiarowy ndarray, tzn. ma 3 osie („osie” jest w liczbie mnogiej „oś”). Konfiguracja abędzie wyglądać jak 3 kromki chleba, przy czym każdy kromka ma wymiar 5 na 7. a[0,:,:]będzie odnosić się do 0-tego wycinka, a[1,:,:]będzie odnosić się do pierwszego wycinka itp.

a.sum(axis=0)będzie stosowany sum()wzdłuż osi 0 a. Dodacie wszystkie plastry i otrzymacie jeden plasterek kształtu (5,7).

a.sum(axis=0) jest równa

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

bi a.sum(axis=0)oba będą wyglądać tak

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.]])

W a pd.DataFrameosie działają w taki sam sposób, jak w numpy.arrays: axis=0zastosuje sum()lub dowolną inną funkcję redukcji dla każdej kolumny.

Uwaga : w odpowiedzi @ zhangxaochen uważam, że zwroty „wzdłuż wierszy” i „wzdłuż kolumn” są nieco mylące. axis=0powinien odnosić się do „wzdłuż każdej kolumny” i axis=1„wzdłuż każdego wiersza”.

Safak Ozkan
źródło
1
To lepsza odpowiedź niż zaakceptowana - ponieważ, jak wspomina Safak, użyte tam wyrażenia są źle sformułowane i prowadzą do jeszcze większej dezorientacji.
javadba
To lepsza odpowiedź
Ravi G,
24

Najprościej jest dla mnie zrozumieć, czy obliczasz statystyki dla każdej kolumny ( axis = 0) czy każdego wiersza (axis = 1 ). Jeśli obliczysz statystykę, powiedzmy średnią, axis = 0otrzymasz tę statystykę dla każdej kolumny. Więc jeśli każda obserwacja jest wierszem, a każda zmienna znajduje się w kolumnie, otrzymasz średnią każdej zmiennej. Jeśli ustawisz axis = 1, to obliczysz statystyki dla każdego wiersza. W naszym przykładzie uzyskałbyś średnią dla każdej obserwacji dla wszystkich zmiennych (być może potrzebujesz średniej pokrewnych miar).

axis = 0: według kolumny = według kolumn = wzdłuż wierszy

axis = 1: przez row = wiersz-wzdłuż = wzdłuż kolumn

Michael
źródło
Myślę, że „wzdłuż” należy zastąpić „wzdłuż”. Podążanie za mną (np. Drogą) oznacza dla mnie pozostanie na tym, ale przy axis=0tym nie pozostajemy w rzędzie powiedzmy, gdy, powiedzmy, obliczając średnią; raczej przechodzimy przez wszystkie wiersze w kolumnie.
Zakłopotany
13

Spójrzmy na tabelę z Wiki. Jest to szacunek MFW PKB na lata 2010-2019 dla dziesięciu najlepszych krajów. wprowadź opis zdjęcia tutaj

1. Oś 1 będzie działać na każdym rzędzie na wszystkich kolumnach
Jeśli chcesz obliczyć średnią (średnia) PKB za każde krajach ponad dekady (2010-2019), trzeba zrobić df.mean(axis=1). Na przykład jeśli chcesz obliczyć średni PKB Stanów Zjednoczonych w latach 2010-2019,df.loc['United States','2010':'2019'].mean(axis=1)

2. Oś 0 będzie działać dla każdej kolumny we wszystkich wierszach
Jeśli chcę obliczyć średni (średni) PKB na KAŻDY rok dla wszystkich krajów, musisz to zrobić df.mean(axis=0). Na przykład, jeśli chcesz obliczyć średni PKB w 2015 r. Dla Stanów Zjednoczonych, Chin, Japonii, Niemiec i Indii, df.loc['United States':'India','2015'].mean(axis=0)

Uwaga: powyższy kod będzie działał tylko po ustawieniu kolumny „Kraj (lub terytorium zależne)” jako Indeksu, przy użyciu set_indexmetoda.

Sumit Pokhrel
źródło
11

Osią w kontekście programowania jest pozycja w krotce kształtu. Oto przykład:

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)

Średnia na osi spowoduje usunięcie tego wymiaru.

Odnosząc się do pierwotnego pytania, kształt dff to (1,2). Użycie osi = 1 spowoduje zmianę kształtu na (1,).

Mark09
źródło
8

Projektant pand, Wes McKinney, intensywnie pracował nad danymi finansowymi. Traktuj kolumny jako nazwy akcji, a indeksy jako ceny dzienne. Następnie możesz odgadnąć, jakie jest domyślne zachowanie (tj. axis=0) W odniesieniu do tych danych finansowych. axis=1może być po prostu uważane za „inny kierunek”.

Na przykład, funkcje statystyki, takie jak mean(), sum(), describe(), count()wszystkie domyślne do kolumny mądry, bo to ma większy sens, aby zrobić je dla każdego zasobu. sort_index(by=)również domyślnie kolumna. fillna(method='ffill')wypełni się wzdłuż kolumny, ponieważ jest to ten sam zapas.dropna()domyślnie wyświetla wiersz, ponieważ prawdopodobnie po prostu chcesz odrzucić cenę tego dnia zamiast wyrzucić wszystkie ceny tego towaru.

Podobnie indeksowanie w nawiasach kwadratowych odnosi się do kolumn, ponieważ bardziej powszechne jest wybieranie akcji zamiast wybierania dnia.

nr
źródło
1
twoje rozumowanie brzmi dobrze, ale średnia (), sum () i inne funkcje mają domyślnie wartość (oś = 0), co jest zgodne z wierszami, a nie jak wspomniano powyżej. I jeśli chodzi o rzędy, wydaje się, że zachowujemy się tak, jak się spodziewamy po kolumnie :) i wydaje się, że to zamieszanie.
bincob,
5

jednym z łatwych sposobów zapamiętania osi 1 (kolumny) w porównaniu z osią 0 (wiersze) jest oczekiwany wynik.

  • jeśli oczekujesz wyniku dla każdego wiersza, użyj osi = „kolumny”,
  • z drugiej strony, jeśli chcesz uzyskać wynik dla każdej kolumny, użyj osi = „wiersze”.
yosemite_k
źródło
Dzięki. Działa to jednak tylko do obliczeń, prawda? Nie działałoby to w przypadku metod takich jak pd.concatlub df.dropna(), które wykorzystują oś Kewarg w większej zdolności identyfikacyjnej.
Bowen Liu
3

Problem z axis=prawidłowym użyciem dotyczy dwóch głównych różnych przypadków:

  1. Do obliczania wartości skumulowanej lub przestawiania (np. Sortowania) danych.
  2. Do manipulowania („bawieniem się”) elementami (np. Ramkami danych ).

Główną ideą tej odpowiedzi jest to, że aby uniknąć pomyłki, wybieramy liczbę lub nazwę określającą konkretną oś, zależności od tego która z nich jest bardziej przejrzysta, intuicyjna i opisowa.

Pandy oparte są na NumPy, która opiera się na matematyce, szczególnie na macierzach n-wymiarowych. Oto obraz do powszechnego użycia nazw osi w matematyce w przestrzeni trójwymiarowej:

wprowadź opis zdjęcia tutaj To zdjęcie służy wyłącznie do zapamiętania liczb porządkowych osi :

  • 0 dla osi x,
  • 1 dla osi y i
  • 2 dla osi Z.

jest tylko do płyt ; w przypadku ramek danych ograniczymy nasze zainteresowanie do zielonej, dwuwymiarowej płaszczyzny podstawowej z osią x ( 0, pionową) i osią y ( 1, poziomą).

wprowadź opis zdjęcia tutaj To wszystko dla liczb jako potencjalnych wartości axis=parametru.

Te nazwy od osi są 'index'(można użyć aliasu 'rows') i 'columns', a do tego wyjaśnienia nie jest ważne, relacja tych nazw i numerów porządkowych (osi), jak każdy wie, co słowa „wiersze” i „kolumny” Średnia ( i wszyscy tutaj - jak sądzę - wiedzą, co oznacza słowo „indeks” w pandach).

A teraz moja rekomendacja:

  1. Jeśli chcesz obliczyć skumulowaną wartość , możesz obliczyć ją z wartości znajdujących się wzdłuż osi 0 (lub wzdłuż osi 1 ) - użyj axis=0(lub axis=1).

    Podobnie, jeśli chcesz zmienić kolejność wartości , użyj numeru osi osi, wzdłuż którego znajdują się dane do zmiany kolejności (np. Do sortowania ).

  2. Jeśli chcesz manipulować (np. Konkatenować ) jednostkami (np. Ramkami danych ) - użyj axis='index'(synonim :)axis='rows' lub axis='columns'określ wynikową zmianę - odpowiednio indeks ( wiersze ) lub kolumny .
    (W celu konkatenacji uzyskasz odpowiednio dłuższy indeks (= więcej wierszy) lub więcej kolumn .)

MarianD
źródło
jest to najlepsza odpowiedź i prawdopodobnie powinna zostać oznaczona jako poprawna odpowiedź przez op!
Anze
2

Jest to oparte na odpowiedzi @ Safak. Najlepszym sposobem na zrozumienie osi w pandach / numpy jest utworzenie tablicy 3d i sprawdzenie wyniku funkcji sumowania wzdłuż 3 różnych osi.

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

będzie:

    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.]]])

Teraz sprawdź sumę elementów tablicy wzdłuż każdej z osi:

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

da ci następujące wyniki:

   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.]])
missnomer
źródło
2

Rozumiem w ten sposób:

Powiedz, że jeśli twoja operacja wymaga przejścia od lewej do prawej / od prawej do lewej w ramce danych, najwyraźniej łączysz kolumny tj. operujesz na różnych kolumnach. To jest oś = 1

Przykład

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

Należy zauważyć, że działamy na kolumnach

Podobnie, jeśli twoja operacja wymaga przejścia od góry do dołu / od dołu do góry w ramce danych, scalasz wiersze. To jest oś = 0 .

Abhishek Raj
źródło
1

Oś = 0 oznacza góra do dołu Oś = 1 oznacza od lewej do prawej

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

Podany przykład bierze sumę wszystkich danych w kolumnie == klucz.

HeadAndTail
źródło
0

Moje myślenie: Oś = n, gdzie n = 0, 1 itd. Oznacza, że ​​macierz jest zwinięta (złożona) wzdłuż tej osi. Tak więc w macierzy 2D, kiedy zwiniemy się wzdłuż 0 (wierszy), naprawdę operujemy na jednej kolumnie na raz. Podobnie w przypadku matryc wyższego rzędu.

Nie jest to to samo, co normalne odniesienie do wymiaru w macierzy, gdzie 0 -> wiersz i 1 -> kolumna. Podobnie w przypadku innych wymiarów w tablicy wymiarów N.

Nkrish
źródło
0

Jestem nowicjuszem w pandach. Ale tak rozumiem oś w pandach:


Stały Zmienny kierunek osi


0 wiersz kolumny w dół |


Kolumna 1 wiersz w prawo ->


Aby obliczyć średnią z kolumny, ta konkretna kolumna powinna być stała, ale wiersze pod nią mogą się zmieniać ( zmieniać ), więc jest to oś = 0.

Podobnie, aby obliczyć średnią rzędu, ten konkretny rząd jest stały, ale może przechodzić przez różne kolumny (różne) , oś = 1.

Harshana Sridhar
źródło
0

Myślę, że istnieje inny sposób, aby to zrozumieć.

W przypadku tablic np., Jeśli chcemy wyeliminować kolumny, używamy osi = 1; jeśli chcemy wyeliminować wiersze, używamy osi = 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,)

W przypadku obiektu pand axis = 0oznacza tryb wierszy i axis = 1tryb kolumn. Różni się to z numpydefinicji, możemy sprawdzić definicje z numpy.doc i pandas.doc

Travis
źródło
0

Będę wyraźnie unikać używania „wierszy” lub „wzdłuż kolumn”, ponieważ ludzie mogą interpretować je dokładnie w niewłaściwy sposób.

Najpierw analogia. Intuicyjnie można oczekiwać, że pandas.DataFrame.drop(axis='column')upuści kolumnę z N kolumn i da (N - 1) kolumny. Więc na razie nie zwracaj uwagi na wiersze (i usuń słowo „wiersz” ze słownika angielskiego). Odwrotnie, drop(axis='row')działa na wierszach.

W ten sam sposób sum(axis='column')działa na wielu kolumnach i daje 1 kolumnę. Podobnie, sum(axis='row')wyniki w 1 rzędzie. Jest to zgodne z najprostszą formą definicji, redukując listę liczb do pojedynczej liczby.

Ogólnie rzecz biorąc, axis=columnwidzisz kolumny, pracujesz nad kolumnami i otrzymujesz kolumny. Zapomnij o wierszach.

Za pomocą axis=rowzmień perspektywę i pracuj nad rzędami.

0 i 1 to tylko aliasy dla „row” i „column”. Jest to konwencja indeksowania macierzy.

lqu
źródło
Ta interpretacja jest niepoprawna, jeśli oś = „kolumny” nie daje kolumn.
user3065757,
@ user3065757 Dzięki za komentarze. Czy możesz podać przykłady?
lqu
Nie do kogo odpowiadasz, ale kiedy próbuję zrozumieć pd.concattwoje wyjaśnienie, to nie do końca działa. Czy mógłbyś wyjaśnić zachowanie konkat z 2 osiami? Dzięki.
Bowen Liu
@BowenLiu Kiedy połączysz 2 listy jabłek, otrzymasz 1 listę więcej jabłek (ale nie większych jabłek). Kiedy konkatujesz wiersze (oś = 0), otrzymujesz więcej wierszy (nie dłuższych); łącząc kolumny (oś = 1), otrzymujesz więcej kolumn (nie dłuższych). Chodzi o oś = 0 działa między rzędami, a nie wewnątrz rzędu.
lqu
0

Próbowałem też ustalić oś przez ostatnią godzinę. Język we wszystkich powyższych odpowiedziach, a także dokumentacja, wcale nie jest pomocny.

Aby odpowiedzieć na pytanie tak, jak je teraz rozumiem, w Pandach oś = 1 lub 0 oznacza, które nagłówki osi mają być stałe podczas stosowania funkcji.

Uwaga: Kiedy mówię nagłówki, mam na myśli nazwy indeksów

Rozszerzanie przykładu:

+------------+---------+--------+
|            |  A      |  B     |
+------------+---------+---------
|      X     | 0.626386| 1.52325|
+------------+---------+--------+
|      Y     | 0.626386| 1.52325|
+------------+---------+--------+

Dla osi = 1 = kolumny: Utrzymujemy stały nagłówek kolumn i stosujemy funkcję średnią, zmieniając dane. Aby to zademonstrować, utrzymujemy stałe nagłówki kolumn jako:

+------------+---------+--------+
|            |  A      |  B     |

Teraz wypełniamy jeden zestaw wartości A i B, a następnie znajdujemy średnią

|            | 0.626386| 1.52325|  

Następnie wypełniamy następny zestaw wartości A i B i znajdujemy średnią

|            | 0.626386| 1.52325|

Podobnie dla osi = wiersze utrzymujemy stałe nagłówki wierszy i ciągle zmieniamy dane: Aby to zademonstrować, najpierw popraw nagłówki wierszy:

+------------+
|      X     |
+------------+
|      Y     |
+------------+

Teraz wypełnij pierwszy zestaw wartości X i Y, a następnie znajdź średnią

+------------+---------+
|      X     | 0.626386
+------------+---------+
|      Y     | 0.626386
+------------+---------+

Następnie wypełnij następny zestaw wartości X i Y, a następnie znajdź średnią:

+------------+---------+
|      X     | 1.52325 |
+------------+---------+
|      Y     | 1.52325 |
+------------+---------+

W podsumowaniu,

Gdy oś = kolumny, naprawiasz nagłówki kolumn i zmieniasz dane, które będą pochodzić z różnych wierszy.

Gdy oś = wiersze, naprawiasz nagłówki wierszy i zmieniasz dane, które będą pochodzić z różnych kolumn.

Zain Khaishagi
źródło
0

wprowadź opis zdjęcia tutaj

wprowadź opis zdjęcia tutaj

oś = 1, da mądry wiersz sumy, keepdims = True zachowa wymiar 2D. Mam nadzieję, że to ci pomoże.

RAHUL KUMAR
źródło
Nie OP, ale dzięki. Myślę, że większość zamieszania, jakie ludzie mają na ten temat, w dokumencie Pandasa oś = 1 odpowiada kolumnom. Jednak tutaj wykonuje obliczenia „wierszowe”.
Bowen Liu
0

Wiele odpowiedzi tutaj bardzo mi pomogło!

W przypadku, gdy zmieszają Cię różne zachowania axisw Pythonie i MARGINR (jak w applyfunkcji), możesz znaleźć interesujący post na blogu: https://accio.github.io/programming/2020/05/ 19 / numpy-pandas-axis.html .

Zasadniczo:

  • Ich zachowania są, co intrygujące, łatwiejsze do zrozumienia w przypadku trójwymiarowej tablicy niż w przypadku tablic dwuwymiarowych.
  • W pakietach Python numpyipandas parametr osi w sumie określa numpy w celu obliczenia średniej wszystkich wartości, które można pobrać w postaci tablicy [0, 0, ..., i, ..., 0], gdzie iteruje się wszystkie możliwe wartości. Proces powtarza się z ustaloną pozycją i, a wskaźniki innych wymiarów zmieniają się jeden po drugim (od najbardziej skrajnie prawego elementu). Wynikiem jest tablica n-1-wymiarowa.
  • W R parametr MARGINS pozwala applyfunkcji obliczyć średnią wszystkich wartości, które można pobrać w postaci tablicy [, ..., i, ...,], gdzie iteruje wszystkie możliwe wartości. Proces ten nie jest powtarzany, gdy wszystkie wartości i zostały iterowane. Dlatego wynik jest prostym wektorem.
Jitao David Zhang
źródło
-6

Tablice są projektowane z tak zwaną osią = 0 i rzędami ustawionymi pionowo w stosunku do osi = 1 oraz kolumnami ustawionymi poziomo. Oś odnosi się do wymiaru tablicy. Ilustracja

Patrick
źródło
axis=0oznacza każdy wiersz zbiorczo, możemy tylko manipulować między wierszami DataFrame zamiast wewnętrznego. axis=1oznacza każdą kolumnę jako zbiorczą, możemy manipulować tylko między kolumnami DataFrame zamiast wewnętrznymi.
Belter,
5
Czy nie jest to dokładnie niewłaściwa metoda, według prawie wszystkich innych opisów na tej stronie (i szybkiego testu z pandami w Jupyter)?
Marc Liyanage,
2
To jest dokładnie odwrotnie. Popraw swoją odpowiedź.
Sumit Pokhrel