Moim zdaniem zaakceptowana odpowiedź jest myląca, ponieważ używa DataFrame tylko z brakującymi wartościami. Nie podoba mi się również określenie oparte na pozycji .iloc
i zamiast tego wolę lokalizację całkowitą, ponieważ jest ona bardziej opisowa i dokładnie to, co .iloc
oznacza. Kluczowym słowem jest INTEGER - .iloc
wymaga INTEGERS.
Zobacz moją bardzo szczegółową serię blogów na temat wyboru podzbiorów, aby uzyskać więcej
.ix jest przestarzałe i niejednoznaczne i nigdy nie należy go używać
Ponieważ .ix
jest przestarzałe, skupimy się tylko na różnicach między .loc
i .iloc
.
Zanim omówimy różnice, ważne jest, aby zrozumieć, że DataFrames mają etykiety, które pomagają zidentyfikować każdą kolumnę i każdy indeks. Rzućmy okiem na przykładową ramkę 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 są etykietami. Etykiety, age
, color
, food
, height
, score
i state
są wykorzystywane do kolumn . Pozostałe etykiety, Jane
, Nick
, Aaron
, Penelope
, Dean
, Christina
, Cornelia
służą do indeksu .
Podstawowymi sposobami wyboru poszczególnych wierszy w ramce danych są narzędzia indeksujące .loc
i .iloc
. Każdy z tych indeksatorów może być również używany 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 bezpośrednio po nazwie dokonują wyboru.
.loc wybiera dane tylko według etykiet
Najpierw porozmawiamy o .loc
indeksatorze, który wybiera dane tylko według etykiet indeksu lub kolumn. W naszym przykładowym DataFrame podaliśmy znaczące nazwy jako wartości dla indeksu. Wiele DataFrames nie będzie miało żadnych znaczących nazw i zamiast tego będzie domyślnie tylko liczbami całkowitymi od 0 do n-1, gdzie n jest długością DataFrame.
Istnieją trzy różne dane wejściowe, których możesz użyć .loc
- Sznurek
- Lista ciągów
- Wycinanie notacji za pomocą łańcuchów jako wartości początkowej i końcowej
Wybór pojedynczego wiersza z .loc z ciągiem znaków
Aby wybrać pojedynczy wiersz danych, umieść etykietę indeksu wewnątrz następujących nawiasów .loc
.
df.loc['Penelope']
Zwraca to wiersz danych jako Serię
age 4
color white
food Apple
height 80
score 3.3
state AL
Name: Penelope, dtype: object
Zaznaczanie 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:
Zaznaczanie wielu wierszy za pomocą .loc z zapisem wycinka
Notacja wycinka jest zdefiniowana przez wartości początkową, zatrzymaną i krokową. Podczas krojenia według etykiety pandy uwzględniają wartość stop na zwrocie. Następujące plastry od Aarona do Deana włącznie. Wielkość kroku nie jest wyraźnie zdefiniowana, ale domyślnie wynosi 1.
df.loc['Aaron':'Dean']
Złożone plastry można pobierać w taki sam sposób, jak listy w języku Python.
.iloc wybiera dane tylko według lokalizacji całkowitej
Przejdźmy teraz do .iloc
. Każdy wiersz i kolumna danych w DataFrame ma liczbę całkowitą, która ją definiuje. Jest to dodatek do etykiety wyświetlanej na wydruku . Lokalizacją całkowitą jest po prostu liczba wierszy / kolumn od góry / po lewej, zaczynająca się od 0.
Istnieją trzy różne dane wejściowe, których możesz użyć .iloc
- Liczba całkowita
- Lista liczb całkowitych
- Odcięcie notacji za pomocą liczb całkowitych jako wartości początkowej i końcowej
Wybór pojedynczego wiersza z .iloc z liczbą całkowitą
df.iloc[4]
Zwraca piąty wiersz (liczba całkowita 4) jako szereg
age 32
color gray
food Cheese
height 180
score 1.8
state AK
Name: Dean, dtype: object
Zaznaczanie wielu wierszy za pomocą .iloc z listą liczb całkowitych
df.iloc[[2, -2]]
Zwraca DataFrame trzeciego i drugiego do ostatniego wiersza:
Zaznaczanie wielu wierszy za pomocą .iloc z zapisem plastra
df.iloc[:5:3]
Jednoczesny wybór wierszy i kolumn za pomocą .loc i .iloc
Jedną z doskonałych zdolności obu .loc/.iloc
jest możliwość jednoczesnego wyboru zarówno wierszy, jak i kolumn. W powyższych przykładach wszystkie kolumny zostały zwrócone z każdego wyboru. Możemy wybrać kolumny z tymi samymi typami danych wejściowych, co w przypadku wierszy. Po prostu musimy oddzielić zaznaczenie wiersza i kolumny przecinkiem .
Na przykład możemy wybrać wiersze Jane i Dean za pomocą wysokości kolumn, wyniku i stanu w następujący sposób:
df.loc[['Jane', 'Dean'], 'height':]
Używa to listy etykiet dla wierszy i notacji plastra 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
Jednoczesny wybór 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 użyteczne, ale czasami mylące i dwuznaczne, i na szczęście zostało wycofane. W przypadku, gdy musisz dokonać wyboru za pomocą kombinacji etykiet i lokalizacji liczb całkowitych, musisz dokonać zarówno etykiet wyboru, jak i lokalizacji liczb całkowitych.
Na przykład, jeśli chcemy wybrać wiersze Nick
i Cornelia
wraz z kolumnami 2 i 4, moglibyśmy skorzystać .loc
z konwersji liczb całkowitych na etykiety z następującymi:
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 index.
labels = ['Nick', 'Cornelia']
index_ints = [df.index.get_loc(label) for label in labels]
df.iloc[index_ints, [2, 4]]
Wybór boolowski
Indeksator .loc może także dokonywać wyboru wartości logicznej. Na przykład, jeśli chcemy znaleźć wszystkie wiersze, w których wiek jest wyższy niż 30 i zwrócić tylko kolumny food
i score
, możemy wykonać następujące czynności:
df.loc[df['age'] > 30, ['food', 'score']]
Możesz to powtórzyć, .iloc
ale nie możesz przekazać mu serii boolowskiej. Musisz przekonwertować wartość logiczną na tablicę liczb liczbowych, 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 za pomocą dwukropka takiego jak ten:
df.loc[:, 'color':'score':2]
Operator indeksowania []
może również wybierać wiersze i kolumny, ale nie jednocześnie.
Większość ludzi zna podstawowy cel operatora indeksowania DataFrame, którym jest wybieranie kolumn. Ciąg wybiera pojedynczą kolumnę jako Serię, a lista ciągów wybiera wiele kolumn jako ramkę danych.
df['food']
Jane Steak
Nick Lamb
Aaron Mango
Penelope Apple
Dean Cheese
Christina Melon
Cornelia Beans
Name: food, dtype: object
Korzystanie z listy wybiera wiele kolumn
df[['food', 'score']]
Ludzie mniej znają to, że przy stosowaniu notacji plastra wybór odbywa się na podstawie etykiet wierszy lub według lokalizacji liczb całkowitych. Jest to bardzo mylące i coś, czego prawie nigdy nie używam, ale działa.
df['Penelope':'Christina'] # slice rows by label
df[2:6:2] # slice rows by integer location
Jednoznaczność z .loc/.iloc
wysoce korzystne dla wierszy zaznaczania. Sam operator indeksowania nie jest w stanie jednocześnie zaznaczyć wierszy i kolumn.
df[3:5, 'color']
TypeError: unhashable type: 'slice'