Istnieją dwa główne sposoby dokonywania wyborów przez pandy z DataFrame.
- Według etykiety
- Według lokalizacji całkowitej
Dokumentacja używa terminu pozycja w odniesieniu do lokalizacji liczb całkowitych . Nie podoba mi się ta terminologia, ponieważ uważam, że jest myląca. Liczba całkowita jest bardziej opisowa i właśnie to .iloc
oznacza. Kluczowym słowem jest tutaj INTEGER - musisz używać liczb całkowitych podczas wybierania według lokalizacji całkowitej.
Zanim pokażemy podsumowanie, upewnijmy się, że ...
Rozszerzenie .ix jest przestarzałe i niejednoznaczne i nigdy nie powinno być używane
Istnieją trzy główne indeksatory dla pand. Mamy sam operator indeksujący (nawiasy []
) .loc
, i .iloc
. Podsumujmy je:
[]
- Przede wszystkim wybiera podzbiory kolumn, ale może również wybierać wiersze. Nie można jednocześnie zaznaczyć wierszy i kolumn.
.loc
- wybiera podzbiory wierszy i kolumn tylko według etykiety
.iloc
- wybiera podzbiory wierszy i kolumn tylko według lokalizacji całkowitej
Prawie nigdy nie używam .at
lub .iat
ponieważ nie dodają dodatkowej funkcjonalności i przy niewielkim wzroście wydajności. Odradzałbym ich używanie, chyba że masz aplikację wymagającą dużej ilości czasu. Mimo wszystko mamy ich podsumowanie:
.at
wybiera pojedynczą wartość skalarną w DataFrame tylko według etykiety
.iat
wybiera pojedynczą wartość skalarną w DataFrame tylko według lokalizacji całkowitej
Oprócz selekcji według etykiety i lokalizacji liczby całkowitej istnieje selekcja logiczna znana również jako indeksowanie logiczne .
Przykłady objaśniające .loc
, .iloc
, wybór i logiczny .at
i .iat
są przedstawione niżej
Najpierw skupimy się na różnicach między .loc
i .iloc
. Zanim porozmawiamy o różnicach, ważne jest, aby zrozumieć, że ramki DataFrames mają etykiety, które pomagają zidentyfikować każdą kolumnę i każdy wiersz. Przyjrzyjmy się przykładowej ramce DataFrame:
df = pd.DataFrame({'age':[30, 2, 12, 4, 32, 33, 69],
'color':['blue', 'green', 'red', 'white', 'gray', 'black', 'red'],
'food':['Steak', 'Lamb', 'Mango', 'Apple', 'Cheese', 'Melon', 'Beans'],
'height':[165, 70, 120, 80, 180, 172, 150],
'score':[4.6, 8.3, 9.0, 3.3, 1.8, 9.5, 2.2],
'state':['NY', 'TX', 'FL', 'AL', 'AK', 'TX', 'TX']
},
index=['Jane', 'Nick', 'Aaron', 'Penelope', 'Dean', 'Christina', 'Cornelia'])
Wszystkie pogrubione słowa to etykiety. Etykiety, age
, color
, food
, height
, score
i state
są wykorzystywane do kolumn . Pozostałe etykiety, Jane
, Nick
, Aaron
, Penelope
, Dean
, Christina
, Cornelia
są używane jako etykiety wierszy. Zbiorczo te etykiety wierszy są nazywane indeksami .
Podstawowymi sposobami wybierania określonych wierszy w DataFrame są indeksatory .loc
i .iloc
. Każdy z tych indeksatorów może również służyć do jednoczesnego wybierania kolumn, ale na razie łatwiej jest skupić się na wierszach. Ponadto każdy z indeksatorów używa zestawu nawiasów, które są bezpośrednio następujące po ich nazwie, aby dokonać wyboru.
.loc wybiera dane tylko według etykiet
Najpierw porozmawiamy o .loc
indeksatorze, który wybiera dane tylko według indeksu lub etykiet kolumn. W naszej przykładowej ramce DataFrame podaliśmy znaczące nazwy jako wartości indeksu. Wiele ramek DataFrame nie będzie miało żadnych znaczących nazw, a zamiast tego domyślnie będzie to tylko liczby całkowite od 0 do n-1, gdzie n to długość (liczba wierszy) ramki DataFrame.
Istnieje wiele różnych wejść, których możesz użyć dla .loc
trzech z nich
- Sznurek
- Lista ciągów
- Notacja wycinków przy użyciu łańcuchów jako wartości początkowej i końcowej
Wybieranie pojedynczego wiersza z .loc z ciągiem
Aby zaznaczyć pojedynczy wiersz danych, umieść etykietę indeksu w następujących nawiasach .loc
.
df.loc['Penelope']
Zwraca wiersz danych jako serię
age 4
color white
food Apple
height 80
score 3.3
state AL
Name: Penelope, dtype: object
Wybieranie wielu wierszy za pomocą .loc z listą ciągów
df.loc[['Cornelia', 'Jane', 'Dean']]
Zwraca DataFrame z wierszami w kolejności określonej na liście:
Wybieranie wielu wierszy za pomocą .loc z notacją plasterków
Notacja wycinka jest definiowana przez wartości początkowe, końcowe i krokowe. Podczas krojenia według etykiety pandy zawierają wartość zatrzymania w zwrocie. Następujące wycinki od Aarona do Deana włącznie. Rozmiar kroku nie jest jawnie zdefiniowany, ale domyślnie wynosi 1.
df.loc['Aaron':'Dean']
Złożone wycinki można pobierać w taki sam sposób, jak listy w Pythonie.
.iloc wybiera dane tylko według lokalizacji całkowitej
Przejdźmy teraz do .iloc
. Każdy wiersz i kolumna danych w ramce DataFrame zawiera liczbę całkowitą, która ją definiuje. Jest to dodatek do etykiety, która jest wizualnie wyświetlana w wyniku. Lokalizacja liczby całkowitej to po prostu liczba wierszy / kolumn od góry / od lewej, zaczynając od 0.
Istnieje wiele różnych wejść, których możesz użyć dla .iloc
trzech z nich
- Liczba całkowita
- Lista liczb całkowitych
- Notacja wycinków przy użyciu liczb całkowitych jako wartości początkowej i końcowej
Wybieranie pojedynczego wiersza z .iloc z liczbą całkowitą
df.iloc[4]
Zwraca piąty wiersz (liczba całkowita 4) jako serię
age 32
color gray
food Cheese
height 180
score 1.8
state AK
Name: Dean, dtype: object
Wybieranie wielu wierszy za pomocą .iloc z listą liczb całkowitych
df.iloc[[2, -2]]
Zwraca DataFrame trzeciego i przedostatniego wiersza:
Wybieranie wielu wierszy za pomocą .iloc z notacją wycinków
df.iloc[:5:3]
Jednoczesny wybór wierszy i kolumn z .loc i .iloc
Jedną z doskonałych możliwości obu .loc/.iloc
jest możliwość jednoczesnego wybierania wierszy i kolumn. W powyższych przykładach wszystkie kolumny zostały zwrócone z każdego wyboru. Możemy wybierać kolumny z tymi samymi typami danych wejściowych, co w przypadku wierszy. Musimy po prostu oddzielić wiersz i zaznaczenie kolumny przecinkiem .
Na przykład możemy wybrać wiersze Jane i Dean tylko z wysokością kolumn, wynikiem i stanem w następujący sposób:
df.loc[['Jane', 'Dean'], 'height':]
Używa to listy etykiet dla wierszy i notacji wycinków dla kolumn
Możemy naturalnie wykonywać podobne operacje .iloc
używając tylko liczb całkowitych.
df.iloc[[1,4], 2]
Nick Lamb
Dean Cheese
Name: food, dtype: object
Jednoczesna selekcja z etykietami i lokalizacją całkowitą
.ix
był używany do dokonywania wyborów jednocześnie z etykietami i lokalizacją liczb całkowitych, co było przydatne, ale czasami mylące i niejednoznaczne, i na szczęście zostało wycofane. W przypadku, gdy musisz dokonać wyboru za pomocą kombinacji etykiet i lokalizacji całkowitych, musisz wybrać zarówno etykiety, jak i lokalizacje całkowite.
Na przykład, jeśli chcemy wybrać wiersze Nick
i Cornelia
razem z kolumnami 2 i 4, możemy użyć .loc
, konwertując liczby całkowite na etykiety z następującym:
col_names = df.columns[[2, 4]]
df.loc[['Nick', 'Cornelia'], col_names]
Lub alternatywnie przekonwertuj etykiety indeksu na liczby całkowite za pomocą get_loc
metody indeksu.
labels = ['Nick', 'Cornelia']
index_ints = [df.index.get_loc(label) for label in labels]
df.iloc[index_ints, [2, 4]]
Wybór logiczny
Indeksator .loc może również wybierać wartości logiczne. Na przykład, jeśli interesuje nas znalezienie wszystkich wierszy, w których wiek jest powyżej 30 lat i zwrócenie tylko kolumn food
i score
, możemy wykonać następujące czynności:
df.loc[df['age'] > 30, ['food', 'score']]
Możesz to powtórzyć za pomocą, .iloc
ale nie możesz przekazać tego serii boolowskiej. Musisz przekonwertować serię boolowską na tablicę numpy, taką jak ta:
df.iloc[(df['age'] > 30).values, [2, 4]]
Zaznaczanie wszystkich wierszy
Można użyć .loc/.iloc
tylko do wyboru kolumny. Możesz zaznaczyć wszystkie wiersze, używając dwukropka w ten sposób:
df.loc[:, 'color':'score':2]
Operator indeksowania,, []
może wycinać, może również zaznaczać wiersze i kolumny, ale nie jednocześnie.
Większość ludzi zna główny cel operatora indeksowania DataFrame, którym jest wybieranie kolumn. Ciąg wybiera jedną kolumnę jako serię, a lista ciągów wybiera wiele kolumn jako DataFrame.
df['food']
Jane Steak
Nick Lamb
Aaron Mango
Penelope Apple
Dean Cheese
Christina Melon
Cornelia Beans
Name: food, dtype: object
Korzystanie z listy powoduje wybranie wielu kolumn
df[['food', 'score']]
To, z czym ludzie są mniej zaznajomieni, to fakt, że gdy używany jest zapis wycinków, selekcja odbywa się według etykiet wierszy lub według położenia liczb całkowitych. Jest to bardzo zagmatwane i prawie nigdy nie używam, ale działa.
df['Penelope':'Christina'] # slice rows by label
df[2:6:2] # slice rows by integer location
.loc/.iloc
Preferowana jest jednoznaczność wybierania wierszy. Sam operator indeksowania nie może jednocześnie zaznaczyć wierszy i kolumn.
df[3:5, 'color']
TypeError: unhashable type: 'slice'
Wybór przez .at
i.iat
Wybór z .at
jest prawie identyczny z, .loc
ale wybiera tylko jedną „komórkę” w ramce DataFrame. Zwykle nazywamy tę komórkę wartością skalarną. Aby użyć .at
, przekaż mu zarówno etykietę wiersza, jak i kolumny oddzielone przecinkiem.
df.at['Christina', 'color']
'black'
Zaznaczenie za pomocą .iat
jest prawie identyczne, .iloc
ale wybiera tylko jedną wartość skalarną. Musisz przekazać mu liczbę całkowitą dla lokalizacji wierszy i kolumn
df.iat[2, 5]
'FL'