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 .ilocoznacza. 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 .atlub .iatponieważ 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 .ati .iatsą przedstawione niżej
Najpierw skupimy się na różnicach między .loci .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, scorei statesą wykorzystywane do kolumn . Pozostałe etykiety, Jane, Nick, Aaron, Penelope, Dean, Christina, Corneliasą używane jako etykiety wierszy. Zbiorczo te etykiety wierszy są nazywane indeksami .
Podstawowymi sposobami wybierania określonych wierszy w DataFrame są indeksatory .loci .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 .locindeksatorze, 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 .loctrzech 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 .iloctrzech 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/.ilocjest 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 .ilocuż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ą
.ixbył 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 Nicki Corneliarazem 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_locmetody 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 foodi score, możemy wykonać następujące czynności:
df.loc[df['age'] > 30, ['food', 'score']]
Możesz to powtórzyć za pomocą, .ilocale 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/.iloctylko 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/.ilocPreferowana 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 .ati.iat
Wybór z .atjest prawie identyczny z, .locale 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ą .iatjest prawie identyczne, .ilocale wybiera tylko jedną wartość skalarną. Musisz przekazać mu liczbę całkowitą dla lokalizacji wierszy i kolumn
df.iat[2, 5]
'FL'