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?
axis=0
wskazującą na agregację wzdłuż wierszy iaxis=1
wskazującą na agregację wzdłuż kolumn jest sposób indeksowania do ramki danych. Indf.iloc[row, column]
,row
znajduje się w pozycji indeksu 0 icolumn
znajduje 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” „.df.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.axis=0
oznacza każdy wiersz zbiorczo, możemy jedynie manipulować DataFrame między wierszami zamiast wewnętrznych.axis=1
oznacza każdą kolumnę jako zbiorczą, możemy manipulować tylko między kolumnami DataFrame zamiast wewnętrznymi. Więc jeśli użyjeszdf.drop("A", axis = 1)
, spowoduje to usunięcie całej kolumny.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:
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.
źródło
Wizualizujmy (zawsze będziesz pamiętać),
W pandach:
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
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.
źródło
axis
odnosi się do wymiaru tablicy, w przypadkupd.DataFrame
saxis=0
jest to wymiar skierowany w dół iaxis=1
ten, który wskazuje w prawo.Przykład: Pomyśl
ndarray
o kształcie z(3,5,7)
.a
jest trójwymiarowyndarray
, tzn. ma 3 osie („osie” jest w liczbie mnogiej „oś”). Konfiguracjaa
bę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 stosowanysum()
wzdłuż osi 0a
. Dodacie wszystkie plastry i otrzymacie jeden plasterek kształtu(5,7)
.a.sum(axis=0)
jest równab
ia.sum(axis=0)
oba będą wyglądać takW a
pd.DataFrame
osie działają w taki sam sposób, jak wnumpy.array
s:axis=0
zastosujesum()
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=0
powinien odnosić się do „wzdłuż każdej kolumny” iaxis=1
„wzdłuż każdego wiersza”.źródło
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 = 0
otrzymasz 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 ustawiszaxis = 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ż wierszyaxis = 1
: przez row = wiersz-wzdłuż = wzdłuż kolumnźródło
axis=0
tym nie pozostajemy w rzędzie powiedzmy, gdy, powiedzmy, obliczając średnią; raczej przechodzimy przez wszystkie wiersze w kolumnie.Spójrzmy na tabelę z Wiki. Jest to szacunek MFW PKB na lata 2010-2019 dla dziesięciu najlepszych krajów.
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_index
metoda.źródło
Osią w kontekście programowania jest pozycja w krotce kształtu. Oto przykład:
Ś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,).
źródło
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=1
moż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.
źródło
jednym z łatwych sposobów zapamiętania osi 1 (kolumny) w porównaniu z osią 0 (wiersze) jest oczekiwany wynik.
źródło
pd.concat
lubdf.dropna()
, które wykorzystują oś Kewarg w większej zdolności identyfikacyjnej.Problem z
axis=
prawidłowym użyciem dotyczy dwóch głównych różnych przypadków: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:
To zdjęcie służy wyłącznie do zapamiętania liczb porządkowych osi :
0
dla osi x,1
dla osi y i2
dla osi Z.Oś 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ą).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:
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
(lubaxis=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 ).
Jeśli chcesz manipulować (np. Konkatenować ) jednostkami (np. Ramkami danych ) - użyj
axis='index'
(synonim :)axis='rows'
lubaxis='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 .)
źródło
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.
będzie:
Teraz sprawdź sumę elementów tablicy wzdłuż każdej z osi:
da ci następujące wyniki:
źródło
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
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 .
źródło
Oś = 0 oznacza góra do dołu Oś = 1 oznacza od lewej do prawej
Podany przykład bierze sumę wszystkich danych w kolumnie == klucz.
źródło
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.
źródło
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.
źródło
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.
W przypadku obiektu pand
axis = 0
oznacza tryb wierszy iaxis = 1
tryb kolumn. Różni się to znumpy
definicji, możemy sprawdzić definicje z numpy.doc i pandas.docźródło
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=column
widzisz kolumny, pracujesz nad kolumnami i otrzymujesz kolumny. Zapomnij o wierszach.Za pomocą
axis=row
zmień perspektywę i pracuj nad rzędami.0 i 1 to tylko aliasy dla „row” i „column”. Jest to konwencja indeksowania macierzy.
źródło
pd.concat
twoje wyjaśnienie, to nie do końca działa. Czy mógłbyś wyjaśnić zachowanie konkat z 2 osiami? Dzięki.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:
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:
Teraz wypełniamy jeden zestaw wartości A i B, a następnie znajdujemy średnią
Następnie wypełniamy następny zestaw wartości A i B i znajdujemy średnią
Podobnie dla osi = wiersze utrzymujemy stałe nagłówki wierszy i ciągle zmieniamy dane: Aby to zademonstrować, najpierw popraw nagłówki wierszy:
Teraz wypełnij pierwszy zestaw wartości X i Y, a następnie znajdź średnią
Następnie wypełnij następny zestaw wartości X i Y, a następnie znajdź średnią:
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.
źródło
oś = 1, da mądry wiersz sumy, keepdims = True zachowa wymiar 2D. Mam nadzieję, że to ci pomoże.
źródło
Wiele odpowiedzi tutaj bardzo mi pomogło!
W przypadku, gdy zmieszają Cię różne zachowania
axis
w Pythonie iMARGIN
R (jak wapply
funkcji), możesz znaleźć interesujący post na blogu: https://accio.github.io/programming/2020/05/ 19 / numpy-pandas-axis.html .Zasadniczo:
numpy
ipandas
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.apply
funkcji 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.źródło
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.
źródło
axis=0
oznacza każdy wiersz zbiorczo, możemy tylko manipulować między wierszami DataFrame zamiast wewnętrznego.axis=1
oznacza każdą kolumnę jako zbiorczą, możemy manipulować tylko między kolumnami DataFrame zamiast wewnętrznymi.