Sortowanie według wartości kolumn
Sortuj DataFrame według jednej lub wielu kolumn za pomocą sort_values(), określaj kolejność rosnącą lub malejącą i kontroluj położenie wartości NaN.
Sortowanie według wartości kolumn to bezpłatna lekcja Pandas & NumPy Academy na CoddyKit. To lekcja 1 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.
Dlaczego sortowanie ma znaczenie
Sortowanie obiektu DataFrame jest ważne ze względu na prezentację (raporty top-N, rankingi), poprawność (operacje na szeregach czasowych wymagają porządku chronologicznego) oraz wydajność (wyszukiwanie binarne w posortowanym indeksie ma złożoność O(log n) zamiast O(n)). Metoda sort_values() biblioteki Pandas jest podstawowym narzędziem do sortowania według zawartości kolumn i zwraca nowy obiekt DataFrame bez modyfikowania oryginału.
import pandas as pd
df = pd.DataFrame({
'name': ['Dave', 'Alice', 'Carol', 'Bob'],
'score': [75, 92, 88, 65]
})
# Sort by score descending (highest first)
ranked = df.sort_values('score', ascending=False)
print(ranked)
# name score
# 1 Alice 92
# 2 Carol 88
# 0 Dave 75
# 3 Bob 65sort_values() — podstawowe użycie
DataFrame.sort_values(by) sortuje wiersze według wartości w określonej kolumnie. Argument by przyjmuje nazwę pojedynczej kolumny (ciąg znaków) lub listę nazw kolumn do sortowania według wielu kluczy. Domyślnie sortowanie odbywa się rosnąco (od najmniejszej wartości). Aby sortować malejąco, należy przekazać ascending=False.
import pandas as pd
df = pd.DataFrame({
'product': ['B', 'A', 'C', 'A', 'B'],
'price': [20, 10, 30, 15, 25]
})
# Ascending by price (default)
print(df.sort_values('price'))
# product price
# 1 A 10
# 3 A 15
# 0 B 20
# 4 B 25
# 2 C 30Sortowanie według wielu kolumn
Przekazanie listy nazw kolumn do sort_values(by=) sortuje najpierw według pierwszej kolumny, następnie rozstrzyga remisy za pomocą drugiej kolumny itd. Parametr ascending również może być listą wartości logicznych odpowiadających kolejności kolumn, co pozwala określić różne kierunki sortowania dla poszczególnych kluczy.
import pandas as pd
df = pd.DataFrame({
'dept': ['HR', 'Eng', 'HR', 'Eng', 'Sales'],
'salary': [50000, 90000, 60000, 80000, 70000],
'name': ['Alice', 'Bob', 'Carol', 'Dave', 'Eve']
})
# Sort by dept A-Z, then by salary descending within each dept
sorted_df = df.sort_values(
by=['dept', 'salary'],
ascending=[True, False]
)
print(sorted_df)
# dept salary name
# 1 Eng 90000 Bob
# 3 Eng 80000 Dave
# 2 HR 60000 Carol
# 0 HR 50000 Alice
# 4 Sales 70000 EvePołożenie NaN za pomocą na_position
Domyślnie wartości NaN są umieszczane na końcu wyniku, niezależnie od tego, czy sortowanie odbywa się rosnąco, czy malejąco. Parametr na_position pozwala tym sterować: 'last' (domyślnie) lub 'first'. Określenie położenia NaN ma znaczenie w tabelach rankingowych — brakujące wartości mogą oznaczać „nieznane” i powinny być wyraźnie oddzielone od prawidłowych wpisów w rankingu.
import pandas as pd
import numpy as np
df = pd.DataFrame({
'name': ['Alice', 'Bob', 'Carol', 'Dave'],
'score': [92, np.nan, 88, np.nan]
})
# NaN last (default)
print(df.sort_values('score', ascending=False, na_position='last'))
# name score
# 0 Alice 92.0
# 2 Carol 88.0
# 1 Bob NaN
# 3 Dave NaN
# NaN first
print(df.sort_values('score', na_position='first').head(2))Sortowanie stabilne i parametr kind=
Pandas domyślnie używa sortowania stabilnego (mergesort o złożoności O(n log n)) — gdy dwa wiersze mają takie same wartości klucza sortowania, zachowana zostaje ich pierwotna kolejność względna. Stabilność ma znaczenie przy sortowaniu najpierw według klucza głównego, a następnie pomocniczego: kolejność ustalona dla klucza głównego zostaje zachowana wśród remisów według klucza pomocniczego. Algorytm można zmienić za pomocą kind='quicksort' (szybszy, ale niestabilny) lub kind='heapsort'.
import pandas as pd
df = pd.DataFrame({
'group': ['A', 'B', 'A', 'B'],
'value': [10, 10, 20, 20],
'original_row': [0, 1, 2, 3]
})
# Stable sort: equal values keep original relative order
result = df.sort_values('value', kind='mergesort')
print(result)
# group value original_row
# 0 A 10 0
# 1 B 10 1 <- row 0 before row 1 (stable)
# 2 A 20 2
# 3 B 20 3inplace=True a ponowne przypisanie
Podobnie jak większość metod Pandas, sort_values() domyślnie zwraca nowy obiekt DataFrame. Przekazanie inplace=True modyfikuje obiekt DataFrame w miejscu i zwraca None. Korzystanie z inplace jest ogólnie odradzane we współczesnym Pandas, ponieważ utrudnia tworzenie potoków operacji i debugowanie — łatwiej zawsze przypisać wynik ponownie: df = df.sort_values('col').
import pandas as pd
df = pd.DataFrame({'x': [3, 1, 4, 1, 5]})
# Preferred: reassign
df = df.sort_values('x')
print(df['x'].tolist()) # [1, 1, 3, 4, 5]
# Alternative: inplace (not recommended for pipelines)
df2 = pd.DataFrame({'x': [3, 1, 4]})
df2.sort_values('x', inplace=True)
print(df2['x'].tolist()) # [1, 3, 4]Resetowanie indeksu po sortowaniu
Po sortowaniu indeks wierszy odzwierciedla pierwotne pozycje. W tabeli posortowanej malejąco wiersz 0 może mieć teraz indeks 4. Wywołanie .reset_index(drop=True) ponownie przypisuje kolejne indeksy, zaczynając od 0. Jest to ważne przed użyciem .iloc[0] do niezawodnego pobrania wiersza zajmującego pierwsze miejsce lub przed eksportem do pliku, w którym luki w indeksie mogą wyglądać myląco.
import pandas as pd
df = pd.DataFrame({'score': [70, 90, 80]})
sorted_df = df.sort_values('score', ascending=False)
print(sorted_df)
# score
# 1 90
# 2 80
# 0 70
# Clean sequential index
reset_df = sorted_df.reset_index(drop=True)
print(reset_df)
# score
# 0 90
# 1 80
# 2 70Pobieranie top-N za pomocą nlargest() i nsmallest()
Do wybrania N pierwszych lub ostatnich wierszy według wartości kolumny funkcje df.nlargest(n, 'col') i df.nsmallest(n, 'col') są wydajniejsze niż sortowanie całego obiektu DataFrame i wycinanie fragmentu. Używają sortowania częściowego (wyboru kopcowego) o złożoności O(n log k) zamiast O(n log n), co ma znaczenie w przypadku dużych obiektów DataFrame.
import pandas as pd
df = pd.DataFrame({
'product': ['A', 'B', 'C', 'D', 'E'],
'revenue': [5000, 12000, 8000, 3000, 15000]
})
# Top 3 by revenue
top3 = df.nlargest(3, 'revenue')
print(top3)
# product revenue
# 4 E 15000
# 1 B 12000
# 2 C 8000
# Bottom 2 by revenue
bottom2 = df.nsmallest(2, 'revenue')
print(bottom2)Sortowanie kolumn kategorycznych według kolejności kategorii
Podczas sortowania kolumny zawierającej uporządkowany typ Categorical metoda sort_values() respektuje kolejność kategorii zamiast kolejności alfabetycznej. Jest to niezbędne do prawidłowego porządkowania poziomów priorytetu, ocen ważności lub oznaczeń rozmiaru — „Small” powinno wystąpić przed „Medium”, a „Medium” przed „Large”, a nie w kolejności alfabetycznej, w której „Large” pojawia się jako pierwsze.
import pandas as pd
df = pd.DataFrame({
'size': pd.Categorical(
['Large', 'Small', 'Medium', 'Small', 'Large'],
categories=['Small', 'Medium', 'Large'],
ordered=True
),
'count': [10, 5, 8, 3, 7]
})
print(df.sort_values('size'))
# size count
# 1 Small 5
# 3 Small 3
# 2 Medium 8
# 0 Large 10
# 4 Large 7Łączenie sortowania z innymi operacjami
Ponieważ sort_values() zwraca obiekt DataFrame, naturalnie integruje się z łańcuchami metod. Typowy schemat wygląda tak: filtrowanie wierszy → agregowanie → sortowanie → wyświetlenie top-N. Łączenie metod utrzymuje potok transformacji w formie liniowej i czytelnej.
import pandas as pd
df = pd.DataFrame({
'dept': ['Eng', 'HR', 'Eng', 'Sales', 'HR', 'Eng'],
'salary': [90000, 50000, 120000, 70000, 55000, 80000]
})
result = (
df
.groupby('dept')['salary'].mean()
.reset_index()
.sort_values('salary', ascending=False)
.head(2)
)
print(result)
# dept salary
# 0 Eng 96666.67
# 2 Sales 70000.00Praktyka: raport 5 najlepszych produktów
Oto praktyczny przykład kompleksowego utworzenia raportu 5 najlepszych produktów według przychodu: wczytanie danych, obliczenie całkowitego przychodu dla każdego produktu, sortowanie malejąco, wybranie 5 najlepszych pozycji, zresetowanie indeksu w celu uzyskania czytelnego numeru pozycji oraz dodanie kolumny z pozycją do wyświetlenia.
import pandas as pd
orders = pd.DataFrame({
'product': ['A', 'B', 'A', 'C', 'B', 'D', 'E', 'A', 'C', 'E'],
'revenue': [100, 200, 150, 80, 300, 60, 400, 120, 90, 350]
})
top5 = (
orders
.groupby('product')['revenue'].sum()
.reset_index()
.sort_values('revenue', ascending=False)
.head(5)
.reset_index(drop=True)
)
top5.index = top5.index + 1 # rank from 1
top5.index.name = 'rank'
print(top5)Szybkie sprawdzenie
Sprawdź, czy rozumie Pan/Pani sortowanie obiektów DataFrame według wartości kolumn.
Podsumowanie lekcji
W tej lekcji nauczył się Pan / nauczyła się Pani: sort_values(by=) sortuje według jednej lub wielu kolumn, ascending= może być listą określającą różne kierunki dla poszczególnych kluczy, na_position='last' steruje położeniem NaN, a nlargest()/nsmallest() wydajnie wybierają N pierwszych lub ostatnich wierszy bez sortowania całego obiektu DataFrame. Po sortowaniu należy zawsze wywołać reset_index(), aby uzyskać czysty, kolejnym numerowany wynik. W następnej części posortujemy według indeksu obiektu DataFrame.
Często zadawane pytania
Czy lekcja „Sortowanie według wartości kolumn” jest bezpłatna?
Tak — pełny tekst „Sortowanie według wartości kolumn” 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 wartości kolumn”?
Sortuj DataFrame według jednej lub wielu kolumn za pomocą sort_values(), określaj kolejność rosnącą lub malejącą i kontroluj położenie wartości NaN. Ć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 1 z 4.
Ile czasu zajmuje lekcja „Sortowanie według wartości kolumn”?
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
- Sortowanie według wartości kolumn
- Sortowanie według indeksu
- Ranking wartości
- Ustawianie i resetowanie indeksu