Pandas & NumPy Academy · Lekcja

Sortowanie według indeksu

Zmień kolejność wierszy według etykiety indeksu za pomocą sort_index() i dowiedz się, kiedy posortowany indeks poprawia wydajność.

Lekcja 2 z 413 kroki

Sortowanie według indeksu 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.

Zrozumienie indeksu obiektu DataFrame

Każdy obiekt DataFrame biblioteki Pandas ma indeks wierszy — zbiór etykiet służących do identyfikowania i uzyskiwania dostępu do wierszy. Domyślnie jest to RangeIndex (0, 1, 2, …), ale można ustawić jako indeks dowolną kolumnę (daty, nazwy, identyfikatory) za pomocą set_index(). Gdy indeks ma znaczenie (np. jest obiektem DatetimeIndex lub zawiera identyfikatory klientów), sortowanie według niego zamiast według wartości kolumny daje logicznie uporządkowany wynik.

import pandas as pd

df = pd.DataFrame(
    {'value': [10, 20, 30]},
    index=['C', 'A', 'B']  # out-of-order alphabetic index
)
print(df)
#    value
# C     10
# A     20
# B     30

sort_index() — rosnąco

DataFrame.sort_index() zmienia kolejność wierszy według etykiety indeksu, a nie według wartości kolumn. Domyślnie sortowanie odbywa się rosnąco — alfabetycznie dla indeksów tekstowych, numerycznie dla indeksów całkowitoliczbowych i chronologicznie dla DatetimeIndex. Jest to standardowy sposób przywracania naturalnej kolejności zbioru danych po przetasowaniu lub dodaniu rekordów poza kolejnością.

import pandas as pd

df = pd.DataFrame(
    {'temp': [22.5, 19.0, 25.1, 18.3]},
    index=pd.to_datetime(['2024-03-01', '2024-01-15', '2024-06-10', '2024-01-01'])
)

sorted_df = df.sort_index()
print(sorted_df)
#             temp
# 2024-01-01  18.3
# 2024-01-15  19.0
# 2024-03-01  22.5
# 2024-06-10  25.1

sort_index() — malejąco

Przekazanie ascending=False sortuje indeks od największej (lub najpóźniejszej) wartości do najmniejszej (lub najwcześniejszej). W przypadku DatetimeIndex najnowsze obserwacje znajdą się na początku, co jest typowym układem danych finansowych, plików dzienników i strumieni zdarzeń, w których najnowsze zdarzenie jest najbardziej istotne.

import pandas as pd

df = pd.DataFrame(
    {'price': [100, 110, 105, 115]},
    index=pd.to_datetime(['2024-01', '2024-02', '2024-03', '2024-04'])
)

# Most recent first
print(df.sort_index(ascending=False))
#             price
# 2024-04-30    115
# 2024-03-31    105
# 2024-02-29    110
# 2024-01-31    100

Sortowanie etykiet kolumn za pomocą axis=1

Domyślnie sort_index() sortuje indeks wierszy (axis=0). Przekazanie axis=1 powoduje sortowanie zamiast tego etykiet kolumn alfabetycznie. Jest to przydatne do standaryzowania szerokich obiektów DataFrame z wieloma kolumnami, aby pojawiały się one w przewidywalnej kolejności alfabetycznej, co ułatwia wizualne znalezienie kolumny lub porównanie obiektów DataFrame.

import pandas as pd

df = pd.DataFrame({
    'zebra': [1], 'apple': [2], 'mango': [3], 'banana': [4]
})

print('Before:', df.columns.tolist())
# ['zebra', 'apple', 'mango', 'banana']

sorted_cols = df.sort_index(axis=1)
print('After:', sorted_cols.columns.tolist())
# ['apple', 'banana', 'mango', 'zebra']

Kiedy posortowany indeks jest szybszy?

Pandas może używać wyszukiwania binarnego przy wyszukiwaniu etykiet, gdy indeks jest posortowany (monotoniczny). Posortowany indeks sprawia, że wycinki .loc['2024-01':'2024-06'] mają złożoność O(log n) zamiast O(n). Metoda is_monotonic_increasing (lub is_monotonic_decreasing) zwraca wartość logiczną wskazującą, czy indeks jest już posortowany. Posortowanie dużego indeksu przed wielokrotnym wycinaniem jest opłacalnym jednorazowym kosztem.

import pandas as pd
import numpy as np

idx = pd.to_datetime(['2024-03-01', '2024-01-15', '2024-06-10'])
df = pd.DataFrame({'v': [1, 2, 3]}, index=idx)

print('Sorted?', df.index.is_monotonic_increasing)  # False

df = df.sort_index()
print('Sorted?', df.index.is_monotonic_increasing)  # True

# Now slicing is efficient
print(df.loc['2024-01':'2024-03'])

sort_index() z MultiIndex

Gdy obiekt DataFrame ma MultiIndex (hierarchiczny indeks wierszy), sort_index() domyślnie sortuje wszystkie poziomy hierarchii. Sortowanie można ograniczyć do określonych poziomów za pomocą parametru level. Posortowany MultiIndex jest wymagany do wydajnego hierarchicznego wycinania za pomocą .loc[(outer, inner), :].

import pandas as pd

arrays = [
    ['B', 'B', 'A', 'A'],
    ['two', 'one', 'two', 'one']
]
idx = pd.MultiIndex.from_arrays(arrays, names=['first', 'second'])
df = pd.DataFrame({'value': [10, 20, 30, 40]}, index=idx)

print(df.sort_index())
#               value
# first second
# A     one       40
#       two       30
# B     one       20
#       two       10

Sortowanie tylko jednego poziomu MultiIndex

W przypadku MultiIndex można chcieć sortować tylko poziom wewnętrzny lub zewnętrzny, zachowując kolejność drugiego poziomu. Do sort_index() należy przekazać level= — przyjmuje on liczbę całkowitą (pozycję poziomu), ciąg znaków (nazwę poziomu) lub listę. Jest to przydatne, gdy kolejność poziomu zewnętrznego jest już prawidłowa i trzeba jedynie posortować elementy w obrębie każdej grupy.

import pandas as pd

df = pd.DataFrame({
    'sales': [300, 100, 200, 400, 150, 250]
}, index=pd.MultiIndex.from_tuples([
    ('Eng', 'Dave'), ('Eng', 'Alice'), ('Eng', 'Bob'),
    ('HR', 'Zoe'), ('HR', 'Carol'), ('HR', 'Eve')
], names=['dept', 'name']))

# Sort only the 'name' level alphabetically within each dept
print(df.sort_index(level='name'))
#              sales
# dept name
# Eng  Alice    100
#      Bob      200
#      Dave     300
# HR   Carol    150
#      Eve      250
#      Zoe      400

Różnica między sort_index() a sort_values()

Ważne jest rozróżnienie obu metod sortowania. sort_values(by='col') zmienia kolejność wierszy na podstawie wartości danych w kolumnie. sort_index() zmienia kolejność wierszy na podstawie etykiety wiersza (indeksu), która może, ale nie musi, odpowiadać którejś kolumnie. Gdy indeks jest głównym identyfikatorem (np. DatetimeIndex lub znaczącym kluczem tekstowym), właściwym wyborem jest sort_index().

import pandas as pd

df = pd.DataFrame(
    {'value': [30, 10, 20]},
    index=['C', 'A', 'B']
)

# sort_index: sorted by row label A, B, C
print(df.sort_index())
#    value
# A     10
# B     20
# C     30

# sort_values: sorted by data value 10, 20, 30
print(df.sort_values('value'))
#    value
# A     10
# B     20
# C     30
# (same here because values happen to match alphabetical label order!)

Przywracanie pierwotnej kolejności po operacjach

Niektóre operacje (tasowanie, losowanie próby za pomocą df.sample(frac=1)) zaburzają kolejność wierszy. sort_index() to prosty sposób na przywrócenie pierwotnej kolejności sekwencyjnej. Jeśli pierwotnym indeksem był RangeIndex (0, 1, 2, …), sort_index() go przywróci; jeśli były to znaczące etykiety, przywróci ich naturalną kolejność.

import pandas as pd

df = pd.DataFrame({'x': [10, 20, 30, 40, 50]})

# Shuffle (random sample)
shuffled = df.sample(frac=1, random_state=42)
print('Shuffled index:', shuffled.index.tolist())
# e.g. [2, 4, 0, 1, 3]

# Restore original order by sorting the index
restored = shuffled.sort_index()
print('Restored index:', restored.index.tolist())
# [0, 1, 2, 3, 4]

sort_index() z parametrem na_position

Podobnie jak sort_values(), sort_index() obsługuje również parametr na_position, który określa położenie etykiet indeksu NaN. Ma to znaczenie, gdy DataFrame ma indeks tekstowy lub datowy zawierający niektóre etykiety NaN (co może się zdarzyć po operacjach wprowadzających brakujące wartości indeksu). Wartością domyślną jest 'last'.

import pandas as pd
import numpy as np

df = pd.DataFrame(
    {'v': [1, 2, 3, 4]},
    index=['B', None, 'A', 'C']
)

print(df.sort_index(na_position='last'))
#      v
# A    3
# B    1
# C    4
# NaN  2

Pomiar wzrostu wydajności

Można empirycznie zmierzyć korzyść wydajnościową wynikającą z posortowania indeksu, używając funkcji timeit z języka Python do porównania wycinka w nieposortowanym i posortowanym DatetimeIndex. W przypadku posortowanego indeksu używane jest wyszukiwanie binarne, dzięki czemu dla dużych DataFrame operacja jest zwykle 5–20 razy szybsza. Pokazuje to, że sort_index() nie jest wyłącznie operacją kosmetyczną — ma rzeczywisty wpływ na czas wykonywania.

import pandas as pd
import numpy as np

np.random.seed(0)
random_dates = pd.to_datetime(
    pd.Timestamp('2020-01-01').value + np.random.randint(0, 1_000_000_000_000_000, size=100_000),
    unit='ns'
)
df = pd.DataFrame({'val': np.random.randn(100_000)}, index=random_dates)

# Without sort: O(n) scan
import timeit
t1 = timeit.timeit(lambda: df.loc['2022-01':'2022-06'], number=100)

df_sorted = df.sort_index()
t2 = timeit.timeit(lambda: df_sorted.loc['2022-01':'2022-06'], number=100)

print(f'Unsorted: {t1:.3f}s, Sorted: {t2:.3f}s, Speedup: {t1/t2:.1f}x')

Szybki test

Sprawdź swoją wiedzę na temat sortowania według indeksu w Pandas.

Podsumowanie lekcji

W tej lekcji nauczyłeś się, że: sort_index() zmienia kolejność wierszy według ich etykiet (a nie wartości kolumn), axis=1 sortuje etykiety kolumn alfabetycznie, a posortowany indeks umożliwia wyszukiwanie binarne, dzięki czemu wycinanie według czasu jest znacznie szybsze. W przypadku DataFrame z MultiIndex parametr level= ogranicza sortowanie do jednego poziomu hierarchii. Przed poleganiem na wydajnym wyszukiwaniu wycinków zawsze sprawdzaj is_monotonic_increasing. W następnej części uszeregujemy wartości w kolumnie.

Bezpłatny start

Ucz się Python dzięki korepetycjom AI — za darmo

Pisz i uruchamiaj kod w przeglądarce, otrzymuj natychmiastową pomoc od korepetytora AI dostępnego 24/7 i kontynuuj naukę w sieci lub w aplikacji.

Kursy
30
Lekcje
120

Często zadawane pytania

Czy lekcja „Sortowanie według indeksu” jest bezpłatna?

Tak — pełny tekst „Sortowanie według indeksu” 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 „Sortowanie według indeksu”?

Zmień kolejność wierszy według etykiety indeksu za pomocą sort_index() i dowiedz się, kiedy posortowany indeks poprawia wydajność. Ć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 „Sortowanie według indeksu”?

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. Sortowanie według wartości kolumn
  2. Sortowanie według indeksu
  3. Ranking wartości
  4. Ustawianie i resetowanie indeksu
← Powrót do Pandas & NumPy Academy