0Pricing
Pandas & NumPy Academy · Lekcja

Dostęp według etykiet i pozycji

Pobierać elementy za pomocą .loc (etykieta) i .iloc (pozycja całkowita) oraz rozumieć różnicę między tymi metodami

Dostęp według etykiet i pozycji to bezpłatna lekcja Pandas & NumPy Academy na CoddyKit. To lekcja 2 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Pandas & NumPy Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Pandas & NumPy Academy zawiera 4 lekcji w sumie.

Dwa sposoby uzyskiwania dostępu do elementów Series

Pandas udostępnia dwa podstawowe akcesory do wybierania elementów z obiektu Series: .loc do dostępu na podstawie etykiety oraz .iloc do dostępu na podstawie pozycji całkowitej. Zrozumienie, którego z nich i kiedy użyć, ma kluczowe znaczenie — użycie niewłaściwego akcesora w obiekcie Series z indeksem całkowitoliczbowym prowadzi do mylących wyników, a w Pandas 2.0 wycofano wiele niejednoznacznych zastosowań bezpośredniego zapisu w nawiasach kwadratowych.

import pandas as pd

s = pd.Series([10, 20, 30], index=['a', 'b', 'c'])
print(s.loc['b'])    # 20  -- by label
print(s.iloc[1])     # 20  -- by position

.loc: dostęp na podstawie etykiety

.loc umożliwia dostęp do elementów na podstawie ich etykiety indeksu. Można przekazać pojedynczą etykietę (zwracany jest skalar), listę etykiet (zwracany jest obiekt Series) albo wycinek etykiet (obejmujący oba końce, inaczej niż wycinki w Pythonie). Jeśli etykieta nie istnieje, Pandas zgłasza wyjątek KeyError. Z .loc należy korzystać, gdy etykiety mają znaczenie, na przykład są datami, nazwami lub identyfikatorami.

import pandas as pd

s = pd.Series([10, 20, 30, 40, 50],
              index=['a', 'b', 'c', 'd', 'e'])

print(s.loc['c'])          # 30
print(s.loc[['a', 'c']])   # a:10 c:30
print(s.loc['b':'d'])      # b:20 c:30 d:40 -- inclusive

.iloc: dostęp na podstawie pozycji

.iloc umożliwia dostęp do elementów na podstawie ich pozycji całkowitoliczbowej (liczonej od 0), całkowicie ignorując etykiety indeksu. Działa podobnie jak indeksowanie listy w Pythonie: pozycje ujemne są liczone od końca, a wycinki stosują obowiązującą w Pythonie konwencję wyłącznego końca. Z .iloc należy korzystać, gdy potrzebny jest „n-ty” element niezależnie od jego etykiety.

import pandas as pd

s = pd.Series([10, 20, 30, 40, 50],
              index=['a', 'b', 'c', 'd', 'e'])

print(s.iloc[2])          # 30  -- third element
print(s.iloc[-1])         # 50  -- last element
print(s.iloc[1:4])        # b:20 c:30 d:40 -- exclusive stop

Różnice między .loc i .iloc

Różnica ma największe znaczenie w przypadku obiektów Series z etykietami całkowitoliczbowymi. Jeśli obiekt Series ma etykiety indeksu [5, 10, 15], wtedy s.loc[5] zwraca element z etykietą 5 (pierwszy element), natomiast s.iloc[5] zgłasza wyjątek IndexError (istnieją tylko 3 elementy). Zawsze należy wybierać akcesor na podstawie tego, czy chodzi o „element oznaczony etykietą X”, czy o „X-ty element”.

import pandas as pd

s = pd.Series([100, 200, 300], index=[5, 10, 15])
print(s.loc[10])   # 200  -- element with label 10
print(s.iloc[1])   # 200  -- second element
# s.loc[1] would raise KeyError -- no label 1

Wybieranie wielu etykiet za pomocą .loc

Do .loc można przekazać listę, aby wybrać wiele elementów w dowolnej kolejności, również z powtórzeniami. Wynikiem jest nowy obiekt Series z tymi samymi etykietami co przekazana lista. Przypomina to zaawansowane indeksowanie w NumPy, ale jest dopasowane według etykiet indeksu, a nie pozycji. Jest to często używane do zmiany kolejności kolumn lub wybrania ich podzbioru w potokach analitycznych.

import pandas as pd

s = pd.Series({'Jan': 100, 'Feb': 200, 'Mar': 300, 'Apr': 400})

# Select Q1 months in reverse order
print(s.loc[['Mar', 'Feb', 'Jan']])
# Mar    300
# Feb    200
# Jan    100

Wybieranie wycinków etykiet za pomocą .loc

W przeciwieństwie do wycinków w Pythonie wycinki .loc obejmują oba końce. s.loc['b':'d'] zwraca elementy z etykietami b, c i d. Może to zaskakiwać, jeśli są Państwo przyzwyczajeni do konwencji wyłącznego końca stosowanej w Pythonie. Należy upewnić się, że etykiety, między którymi tworzony jest wycinek, rzeczywiście występują w indeksie — w przeciwnym razie wycinek może po cichu zwrócić nieoczekiwane wyniki.

import pandas as pd

s = pd.Series(range(5), index=['a', 'b', 'c', 'd', 'e'])
print(s.loc['b':'d'])
# b    1
# c    2
# d    3
# dtype: int64
# Note: 'd' is INCLUDED (inclusive stop)

Indeksowanie logiczne za pomocą .loc

Do .loc można przekazać serię wartości logicznych, aby filtrować elementy. Seria wartości logicznych musi mieć taki sam indeks jak docelowy obiekt Series. Jest to odpowiednik maskowania logicznego z NumPy i obsługuje złożone warunki z użyciem & oraz |. Jest to również standardowy sposób filtrowania wierszy w obiektach DataFrame.

import pandas as pd

s = pd.Series([3, 7, 2, 9, 1], index=['a', 'b', 'c', 'd', 'e'])
print(s.loc[s > 4])
# b    7
# d    9
# dtype: int64

Ustawianie wartości za pomocą .loc i .iloc

Zarówno .loc, jak i .iloc mogą występować po lewej stronie przypisania, aby modyfikować wartości w miejscu. Jest to poprawny wzorzec — użycie indeksowania łańcuchowego, takiego jak s['a'] = 99, może w obiektach DataFrame wywołać ostrzeżenie SettingWithCopyWarning. W przypadku obiektów Series bezpośredni dostęp według etykiety jest zazwyczaj bezpieczny, ale zapis z użyciem .loc jest jednoznaczny i zalecany.

import pandas as pd

s = pd.Series([10, 20, 30], index=['a', 'b', 'c'])
s.loc['b'] = 99
print(s)
# a    10
# b    99
# c    30

Dostęp w nawiasach kwadratowych do obiektu Series

Bezpośredni zapis w nawiasach kwadratowych s['label'] działa przy dostępie według etykiety i jest równoważny zapisowi s.loc['label'] w przypadku indeksów tekstowych. W przypadku indeksów całkowitoliczbowych zachowanie było niejednoznaczne i zmieniono je w Pandas 2.0 — obecnie taki zapis zawsze oznacza dostęp według etykiety. Aby kod był jednoznaczny i odporny na przyszłe zmiany, należy zawsze jawnie używać .loc lub .iloc, zamiast polegać na rozstrzyganiu znaczenia nawiasów kwadratowych.

import pandas as pd

s = pd.Series([10, 20, 30], index=['x', 'y', 'z'])
print(s['y'])      # 20  -- label access via brackets
print(s.loc['y']) # 20  -- explicit and preferred

Dostęp do elementów z użyciem DatetimeIndex

Gdy obiekt Series ma indeks DatetimeIndex, .loc akceptuje częściowe ciągi dat, co ułatwia wybieranie zakresów. s.loc['2023'] zwraca wszystkie elementy z roku 2023, a s.loc['2023-01':'2023-06'] zwraca pierwszą połowę roku 2023. Jest to jedna z najbardziej wygodnych funkcji Pandas przy pracy z szeregami czasowymi.

import pandas as pd

dates = pd.date_range('2023-01-01', periods=5, freq='ME')
values = pd.Series([10, 20, 30, 40, 50], index=dates)
print(values.loc['2023-03':'2023-05'])
# 2023-03-31    30
# 2023-04-30    40
# 2023-05-31    50

at i iat do szybkiego dostępu do pojedynczych elementów

.at[label] i .iat[position] to zoptymalizowane akcesory skalarne — przy dostępie do pojedynczego elementu w ciasnej pętli są szybsze niż .loc i .iloc, ponieważ pomijają narzut związany ze zwracaniem obiektu Series. Nie można ich używać do wybierania wielu elementów. Należy ich używać, gdy potrzebna jest maksymalna wydajność przy wielokrotnym wyszukiwaniu pojedynczych elementów.

import pandas as pd

s = pd.Series([10, 20, 30], index=['a', 'b', 'c'])
print(s.at['b'])    # 20  -- label scalar access
print(s.iat[2])     # 30  -- position scalar access

Szybkie sprawdzenie

Sprawdź swoją wiedzę na temat .loc i .iloc z tego урокu.

Podsumowanie lekcji

W tej lekcji nauczyli się Państwo, że: .loc uzyskuje dostęp do elementów według etykiety indeksu, a końce wycinków obejmują, .iloc uzyskuje dostęp do elementów według pozycji całkowitoliczbowej, a końce wycinków są wyłączone, tak jak w listach Pythona, oraz że .at i .iat to szybsze akcesory skalarne do wyszukiwania pojedynczych elementów w pętlach. Następnie omówimy operacje zwektoryzowane na obiektach Series oraz sposób, w jaki Pandas automatycznie dopasowuje indeksy.

Często zadawane pytania

Czy lekcja „Dostęp według etykiet i pozycji” jest bezpłatna?

Tak — pełny tekst „Dostęp według etykiet i pozycji” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Pandas & NumPy Academy, przejdź na CoddyKit PRO. Kurs Pandas & NumPy Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „Dostęp według etykiet i pozycji”?

Pobierać elementy za pomocą .loc (etykieta) i .iloc (pozycja całkowita) oraz rozumieć różnicę między tymi metodami Ćwiczysz Pandas & NumPy Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć Pandas & NumPy Academy?

Nie wymagamy żadnego doświadczenia. Pandas & NumPy Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 2 z 4.

Ile czasu zajmuje lekcja „Dostęp według etykiet i pozycji”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji Pandas & NumPy Academy?

Tak. Każda lekcja Pandas & NumPy Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Tworzenie Series
  2. Dostęp według etykiet i pozycji
  3. Operacje zwektoryzowane na Series
  4. Przydatne metody Series
← Powrót do Pandas & NumPy Academy