0Pricing
Pandas & NumPy Academy · Lekcja

Wyrównywanie indeksów i zmiana indeksu

Wyrównaj dwa obiekty DataFrame do wspólnego indeksu za pomocą reindex(), uzupełniaj brakujące etykiety i poznaj sposób wyrównywania indeksów podczas działań arytmetycznych.

Wyrównywanie indeksów i zmiana indeksu to bezpłatna lekcja Pandas & NumPy Academy na CoddyKit. To lekcja 3 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.

Jak Pandas wyrównuje indeksy

Jednym z najpotężniejszych, a czasem zaskakujących mechanizmów Pandas jest automatyczne wyrównywanie indeksów. Gdy dodają Państwo, odejmują lub w inny sposób łączą dwie serie Series albo obiekty DataFrame, Pandas najpierw wyrównuje je według etykiet indeksu, a dopiero potem wykonuje operację. Operacje są wykonywane dla pasujących etykiet, natomiast niepasujące etykiety dają wartość NaN. Zapobiega to cichym błędom wynikającym z niedopasowania danych i umożliwia bezpieczne łączenie danych z różnych źródeł bez ręcznego sortowania lub zmiany kolejności.

import pandas as pd

s1 = pd.Series([10, 20, 30], index=['a', 'b', 'c'])
s2 = pd.Series([1, 2, 3], index=['b', 'c', 'd'])

# Alignment in action: a→NaN, d→NaN
result = s1 + s2
print('s1 + s2 with automatic alignment:')
print(result)

NaN wynikające z niedopasowanych indeksów

Gdy etykiety indeksu nie pasują do siebie, Pandas wstawia NaN w brakujące miejsca. Jest to zamierzone: sygnalizuje „brak odpowiadającej wartości w jednym z operandów”. Zawsze sprawdzaj wynik działań arytmetycznych między dwiema seriami Series lub obiektami DataFrame pod kątem nieoczekiwanych wartości NaN — wskazują one na niedopasowanie indeksów. Użyj fill_value=0 w metodzie arytmetycznej (s1.add(s2, fill_value=0)), aby traktować brakujące wyrównane wartości jako zero zamiast propagować NaN.

import pandas as pd

s1 = pd.Series({'a': 10, 'b': 20, 'c': 30})
s2 = pd.Series({'b': 1, 'c': 2, 'd': 3})

# Default: NaN where labels don't match
print('Default (NaN for unmatched):')
print(s1 + s2)

# fill_value=0: treat missing as zero
print('\nWith fill_value=0:')
print(s1.add(s2, fill_value=0))

Wyrównywanie podczas działań arytmetycznych na DataFrame

Wyrównywanie dotyczy zarówno wierszy, jak i kolumn podczas łączenia dwóch obiektów DataFrame. Wynik zawiera sumę obu zbiorów indeksów i obu zbiorów kolumn, a w miejscach, w których jeden z obiektów DataFrame nie miał wartości, znajduje się NaN. Odpowiada to pełnemu zewnętrznemu złączeniu według indeksu i kolumn jednocześnie. Oznacza to, że można bezpiecznie dodawać obiekty DataFrame z różnych okresów obrachunkowych — miesiące występujące tylko w jednym z nich otrzymają NaN, które można następnie uzupełnić lub usunąć.

import pandas as pd

df1 = pd.DataFrame({'revenue': [100, 200], 'cost': [80, 150]}, index=['Jan', 'Feb'])
df2 = pd.DataFrame({'revenue': [120, 210], 'headcount': [5, 6]}, index=['Feb', 'Mar'])

result = df1 + df2
print('Combined DataFrame (union of index and columns):')
print(result)

Metoda reindex()

df.reindex(new_index) zwraca nowy DataFrame dopasowany do listy etykiet new_index. Etykiety występujące zarówno w oryginalnym, jak i nowym indeksie zostają zachowane; etykiety obecne w new_index, ale nieobecne w oryginalnym indeksie, otrzymują NaN; etykiety obecne w oryginalnym indeksie, ale nieobecne w new_index, zostają usunięte. Jest to jawny sposób dopasowania DataFrame do docelowego zbioru etykiet przed wykonaniem operacji.

import pandas as pd

s = pd.Series({'a': 10, 'b': 20, 'c': 30})

# Reindex to a new label set
reindexed = s.reindex(['b', 'c', 'd', 'e'])
print('Original:', s.index.tolist())
print('New index: [b, c, d, e]')
print('\nReindexed Series:')
print(reindexed)
# b, c preserved; d, e → NaN; a dropped

Uzupełnianie brakujących wartości po ponownym indeksowaniu

reindex() przyjmuje parametr fill_value, który podstawia stałą wartość za nowe etykiety, oraz parametr method do uzupełniania w przód ('ffill') lub wstecz ('bfill'). Metody te są najbardziej przydatne w przypadku danych szeregów czasowych, gdy ponownie indeksują Państwo serię Series względem pełnego zakresu dat i chcą uzupełnić brakujące dni ostatnią znaną wartością zamiast NaN.

import pandas as pd

# Sparse daily data with gaps
s = pd.Series(
    [10, 20, 30],
    index=pd.to_datetime(['2024-01-01', '2024-01-03', '2024-01-07'])
)

# Reindex to complete date range
full_range = pd.date_range('2024-01-01', '2024-01-07')
print('Forward fill (carry last known value):')
print(s.reindex(full_range, method='ffill'))

print('\nFill with 0:')
print(s.reindex(full_range, fill_value=0))

Ponowne indeksowanie kolumn

reindex działa również na kolumnach: df.reindex(columns=['col1', 'col2', 'new_col']). Nowe kolumny, których nie ma w oryginalnym DataFrame, są dodawane z wartościami NaN. Istniejące kolumny, których nie ma na nowej liście, zostają usunięte. Jest to przydatne do wymuszania kanonicznego schematu kolumn w wielu obiektach DataFrame pochodzących z różnych źródeł i mogących mieć niespójne zestawy kolumn.

import pandas as pd

df = pd.DataFrame({
    'name': ['Alice', 'Bob'],
    'age': [30, 25],
    'city': ['NY', 'LA']
})

# Enforce a canonical column order and add missing columns
canonical_cols = ['name', 'age', 'email', 'city', 'country']
df_reindexed = df.reindex(columns=canonical_cols)
print(df_reindexed)
# 'email' and 'country' are new → NaN

Używanie align() do synchronizowania dwóch obiektów

s1.align(s2) zwraca dwa nowe obiekty z tym samym indeksem (sumą lub częścią wspólną, zależnie od parametru join), dzięki czemu są one gotowe do operacji element po elemencie. Odpowiada to jednoczesnemu ponownemu indeksowaniu obu obiektów względem tego samego zbioru etykiet. Użyj join='inner', aby zachować tylko wspólne etykiety, lub join='outer' (wartość domyślna), aby zachować wszystkie etykiety z obu obiektów, wstawiając NaN w miejscach niedopasowania.

import pandas as pd

s1 = pd.Series({'a': 10, 'b': 20, 'c': 30})
s2 = pd.Series({'b': 1, 'c': 2, 'd': 3})

# Align to common labels only (inner join)
s1_aligned, s2_aligned = s1.align(s2, join='inner')
print('Inner-aligned s1:')
print(s1_aligned)
print('Inner-aligned s2:')
print(s2_aligned)

print('\nProduct on common labels:')
print(s1_aligned * s2_aligned)

Wyrównywanie w merge a działania arytmetyczne

Pandas oferuje dwie metody łączenia obiektów DataFrame: merge/join (jawne dopasowywanie kluczy w stylu SQL) oraz działania arytmetyczne z wyrównywaniem indeksów (niejawne, oparte na etykietach). Używaj merge podczas łączenia ustrukturyzowanych tabel z jawnymi kolumnami kluczy. Wyrównywanie arytmetyczne stosuj podczas obliczeń między obiektami DataFrame, które powinny naturalnie współdzielić indeks — na przykład przy odejmowaniu DataFrame kosztów od DataFrame przychodów, gdy oba są indeksowane według (region, miesiąc).

import pandas as pd

# Two DataFrames sharing the same index
revenue = pd.Series({'North': 500, 'South': 300, 'East': 450})
costs = pd.Series({'North': 350, 'South': 280, 'West': 400})

# Automatic alignment: 'East' and 'West' don't match → NaN
profit = revenue - costs
print('Profit by region:')
print(profit)

# If you want only common regions
profit_inner = revenue.align(costs, join='inner')[0] - revenue.align(costs, join='inner')[1]
print('\nProfit (common regions only):')
print(profit_inner)

Sprawdzanie równości indeksów przed operacjami

Przed wykonaniem operacji na dwóch obiektach DataFrame sprawdź, czy ich indeksy są zgodne, za pomocą (df1.index == df2.index).all(). Jeśli indeksy różnią się tylko kolejnością, przed porównaniem posortuj oba. W przypadku obiektów DataFrame wczytanych z różnych źródeł dobrą praktyką jest jawne wyrównanie lub ponowne indeksowanie przed wykonaniem działań arytmetycznych, aby uniknąć przypadkowego propagowania NaN. Udokumentuj wszelkie założenia dotyczące wyrównywania w komentarzach lub dziennikach potoku.

import pandas as pd

df1 = pd.DataFrame({'sales': [100, 200, 300]}, index=['Q1', 'Q2', 'Q3'])
df2 = pd.DataFrame({'cost': [80, 160, 240]}, index=['Q1', 'Q2', 'Q3'])

# Check index equality
if (df1.index == df2.index).all():
    print('Indices match — safe to combine.')
    combined = pd.concat([df1, df2], axis=1)
    combined['profit'] = combined['sales'] - combined['cost']
    print(combined)
else:
    print('Indices differ — align before combining!')

Praktyczny wzorzec: ujednolicanie kształtów

Typowy wzorzec podczas wczytywania danych z wielu plików lub wywołań API polega na tym, że każda partia obejmuje inny podzbiór kluczy. Przed konkatenacją lub agregacją ponownie indeksuj wszystkie partie względem pełnej znanej przestrzeni kluczy, używając fill_value=0. Dzięki temu każda partia ma taki sam kształt (ten sam indeks i te same kolumny) przed wykonaniem operacji, co zapobiega cichym niezgodnościom kształtów prowadzącym do nieprawidłowych wyników agregacji.

import pandas as pd

# Two sales batches with different product sets
batch1 = pd.Series({'laptop': 50, 'phone': 80, 'tablet': 30})
batch2 = pd.Series({'phone': 90, 'tablet': 40, 'headphones': 60})

# Full product catalogue
all_products = ['laptop', 'phone', 'tablet', 'headphones']

# Standardise both to the full catalogue
b1 = batch1.reindex(all_products, fill_value=0)
b2 = batch2.reindex(all_products, fill_value=0)

total = b1 + b2
print('Total sales per product:')
print(total)

Przypadki brzegowe wyrównywania indeksów

Dwa ważne przypadki brzegowe: Duplikaty etykiet — jeśli oba obiekty Series mają zduplikowane etykiety indeksu, wyrównanie powoduje rozwinięcie przypominające iloczyn kartezjański, z wieloma wartościami NaN (Pandas nie zakłada, które duplikaty odpowiadają sobie nawzajem). Przed wyrównywaniem arytmetycznym należy zawsze upewnić się, że indeksy są unikatowe. Indeksy typu integer a object — RangeIndex(0,5) i Int64Index([0,1,2,3,4]) mogą nie zostać idealnie wyrównane po wykonaniu operacji, ponieważ jeden indeks jest wywnioskowany, a drugi jawnie określony. Należy użyć reset_index(drop=True), aby je ujednolicić.

import pandas as pd

# Duplicate label alignment — produces unexpected expansion
s1 = pd.Series([1, 2, 3], index=['a', 'a', 'b'])
s2 = pd.Series([10, 20], index=['a', 'b'])

result = s1 + s2
print('Result with duplicate indices (unexpected expansion):')
print(result)
print('\nAlways ensure unique indices before arithmetic!')

Szybkie sprawdzenie

Sprawdź swoją wiedzę na temat wyrównywania indeksów i zmiany indeksu na podstawie tej lekcji.

Podsumowanie lekcji

W tej lekcji nauczyli się Państwo, że Pandas wykonuje automatyczne wyrównywanie indeksów podczas operacji arytmetycznych, wstawiając NaN dla niedopasowanych etykiet; reindex() dostosowuje DataFrame do docelowego zestawu etykiet, oferując opcje wypełniania brakujących etykiet; a align() jednocześnie synchronizuje dwa obiekty względem tego samego indeksu. W następnej części omówimy korzyści wydajnościowe posortowanych indeksów oraz sposób ich mierzenia za pomocą timeit.

Często zadawane pytania

Czy lekcja „Wyrównywanie indeksów i zmiana indeksu” jest bezpłatna?

Tak — pełny tekst „Wyrównywanie indeksów i zmiana 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 „Wyrównywanie indeksów i zmiana indeksu”?

Wyrównaj dwa obiekty DataFrame do wspólnego indeksu za pomocą reindex(), uzupełniaj brakujące etykiety i poznaj sposób wyrównywania indeksów podczas działań arytmetycznych. Ć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 3 z 4.

Ile czasu zajmuje lekcja „Wyrównywanie indeksów i zmiana 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. Tworzenie MultiIndex
  2. Wybieranie danych z MultiIndex
  3. Wyrównywanie indeksów i zmiana indeksu
  4. Korzyści z wydajności posortowanych indeksów
← Powrót do Pandas & NumPy Academy