Niedawno zacząłem rozgałęziać się z mojego bezpiecznego miejsca (R) do Pythona i jestem trochę zdezorientowany lokalizacją / wyborem komórki w Pandas
. Przeczytałem dokumentację, ale staram się zrozumieć praktyczne konsekwencje różnych opcji lokalizacji / wyboru.
- Czy jest jakiś powód, dla którego powinienem używać
.loc
lub.iloc
przekraczać najbardziej ogólną opcję.ix
? - Rozumiem, że
.loc
,iloc
,at
, iiat
może zapewnić pewne gwarantowane poprawności że.ix
nie może zaoferować, ale ja również czytać gdzie.ix
wydaje się być najszybszym rozwiązaniem całej planszy. - Proszę wyjaśnić rzeczywiste, najlepsze praktyki uzasadniające używanie czegokolwiek innego niż
.ix
?
loc
jest indeksowaniem opartym na etykietach, więc w zasadzie wyszukuje wartość w wierszu,iloc
jest indeksowaniem opartym na wierszach całkowitych,ix
jest ogólną metodą, która najpierw wykonuje oparte na etykiecie, jeśli to się nie powiedzie, przechodzi do liczb całkowitych.at
jest przestarzała i odradza się jej już używanie. Inną rzeczą do rozważenia jest to, co próbujesz zrobić, ponieważ niektóre z tych metod pozwalają na krojenie i przypisywanie kolumn, szczerze mówiąc, dokumenty są dość jasne: pandas.pydata.org/pandas-docs/stable/indexing.htmlat
jest to przestarzałe? Nie widzę tego w dokumentach at (lub iat ).loc
,ix
iiloc
tutaj: stackoverflow.com/questions/31593201/...Odpowiedzi:
loc: działa tylko na indeksie
iloc: działa na pozycji
ix: Możesz pobrać dane z dataframe bez znajdowania się w indeksie
pod adresem: get wartości skalarne. To bardzo szybka lokalizacja
: pobierz wartości skalarne. To bardzo szybki iloc
http://pyciencia.blogspot.com/2015/05/obtener-y-filtrar-datos-de-un-dataframe.html
Uwaga: Począwszy od
pandas 0.20.0
The.ix
indekser jest przestarzałe na rzecz bardziej rygorystyczne.iloc
i.loc
indeksujących.źródło
at
iiat
są bardzo szybkimi wersjami programuloc
iiloc
, to po co używaćloc
iwiloc
ogóle?at
aiat
przeznaczone do uzyskiwania dostępu do wartości skalarnej, to znaczy do pojedynczego elementu w ramce danych, podczas gdyloc
iiloc
są przeznaczone do uzyskiwania dostępu do kilku elementów w tym samym czasie, potencjalnie w celu wykonywania operacji wektoryzowanych.Zaktualizowano,
pandas
0.20
ponieważix
jest przestarzały. To pokazuje nie tylko, jak używaćloc
,iloc
,at
,iat
,set_value
, ale jak tego dokonać, mieszane indeksowanie oparciu pozycyjny / etykiety.loc
- oparte na etykietachUmożliwia przekazywanie tablic 1-D jako indeksatorów. Tablice mogą być wycinkami (podzestawami) indeksu lub kolumny lub mogą to być tablice logiczne o długości równej indeksowi lub kolumnom.
Uwaga specjalna: po przekazaniu indeksatora skalarnego
loc
można przypisać nowy indeks lub wartość kolumny, która wcześniej nie istniała.iloc
- na podstawie pozycjiPodobnie jak z
loc
wyjątkiem z pozycjami, a nie wartościami indeksu. Nie możesz jednak przypisać nowych kolumn ani indeksów.at
- oparty na etykietachDziała bardzo podobnie do
loc
indeksatorów skalarnych. Nie można operować na indeksatorach tablic. Mogą! przypisać nowe indeksy i kolumny.Zaletą przez
loc
to, że jest to szybsze.Wadą jest to, że nie można używać tablic dla indeksatorów.
iat
- na podstawie pozycjiDziała podobnie do
iloc
. Nie można pracować w indeksatorach tablic. Nie mogę! przypisać nowe indeksy i kolumny.Zaletą przez
iloc
to, że jest to szybsze.Wadą jest to, że nie można używać tablic dla indeksatorów.
set_value
- oparty na etykietachDziała bardzo podobnie do
loc
indeksatorów skalarnych. Nie można operować na indeksatorach tablic. Mogą! przypisać nowe indeksy i kolumnyKorzyść Bardzo szybko, ponieważ koszty ogólne są bardzo małe!
Wady Jest bardzo mało narzutów, ponieważ
pandas
nie przeprowadza się wielu kontroli bezpieczeństwa. Używaj na własne ryzyko . Nie jest to również przeznaczone do użytku publicznego.set_value
withtakable=True
- position basedDziała podobnie do
iloc
. Nie można pracować w indeksatorach tablic. Nie mogę! przypisać nowe indeksy i kolumny.Korzyść Bardzo szybko, ponieważ koszty ogólne są bardzo małe!
Wady Jest bardzo mało narzutów, ponieważ
pandas
nie przeprowadza się wielu kontroli bezpieczeństwa. Używaj na własne ryzyko . Nie jest to również przeznaczone do użytku publicznego.źródło
set_value
został wycofany na korzyść wersji 0.21.at
i.iat
od wersji 0.21Istnieją dwa główne sposoby dokonywania wyborów przez pandy z DataFrame.
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łkowitejPrawie 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łkowitejOpró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żejNajpierw 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:Wszystkie pogrubione słowa to etykiety. Etykiety,
age
,color
,food
,height
,score
istate
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 nichWybieranie pojedynczego wiersza z .loc z ciągiem
Aby zaznaczyć pojedynczy wiersz danych, umieść etykietę indeksu w następujących nawiasach
.loc
.Zwraca wiersz danych jako serię
Wybieranie wielu wierszy za pomocą .loc z listą ciągów
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.
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 nichWybieranie pojedynczego wiersza z .iloc z liczbą całkowitą
Zwraca piąty wiersz (liczba całkowita 4) jako serię
Wybieranie wielu wierszy za pomocą .iloc z listą liczb całkowitych
Zwraca DataFrame trzeciego i przedostatniego wiersza:
Wybieranie wielu wierszy za pomocą .iloc z notacją wycinków
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:
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.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
iCornelia
razem z kolumnami 2 i 4, możemy użyć.loc
, konwertując liczby całkowite na etykiety z następującym:Lub alternatywnie przekonwertuj etykiety indeksu na liczby całkowite za pomocą
get_loc
metody indeksu.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
iscore
, możemy wykonać następujące czynności: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: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: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.
Korzystanie z listy powoduje wybranie wielu kolumn
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.
.loc/.iloc
Preferowana jest jednoznaczność wybierania wierszy. Sam operator indeksowania nie może jednocześnie zaznaczyć wierszy i kolumn.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.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źródło
źródło
Zacznijmy od tego małego df:
Będziemy mieć
Dzięki temu mamy:
Dlatego nie możemy używać .iat dla podzbioru, gdzie musimy używać tylko .iloc.
Ale spróbujmy zarówno wybrać z większego df, jak i sprawdźmy prędkość ...
Więc z .loc możemy zarządzać podzbiorami, a z .at tylko pojedynczym skalarem, ale .at jest szybszy niż .loc
:-)
źródło