0Pricing
Pandas & NumPy Academy · Lekcja

Łączenie według indeksu

Użyj DataFrame.join() oraz ustaw left_index/right_index=True w merge(), aby połączyć obiekty DataFrame wyrównane według indeksu.

Łączenie według indeksu to bezpłatna lekcja Pandas & NumPy Academy na CoddyKit. To lekcja 4 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.

Złączenia oparte na indeksie

Do tej pory scalali Państwo ramki danych, dopasowując wartości w zwykłych kolumnach. Czasami jednak informacje, na podstawie których chcą Państwo wykonać dopasowanie, są przechowywane w indeksie ramki danych, a nie w kolumnie. Pandas obsługuje złączenia oparte na indeksie za pomocą DataFrame.join() oraz pd.merge() z parametrami left_index=True lub right_index=True.

Metoda DataFrame.join()

DataFrame.join(other) to pomocnicza metoda, która domyślnie wykonuje złączenie po indeksach obu ramek danych. Jest równoważna wywołaniu pd.merge() z argumentami left_index=True, right_index=True. Domyślnym typem złączenia jest 'left', w przeciwieństwie do pd.merge(), którego domyślnym typem jest 'inner'. Obie ramki danych muszą mieć wspólne, znaczące etykiety indeksu, aby złączenie dało poprawne wyniki.

import pandas as pd

profiles = pd.DataFrame(
    {'age': [25, 30, 22]},
    index=['alice', 'bob', 'carol']
)

scores = pd.DataFrame(
    {'score': [88, 95, 70]},
    index=['alice', 'carol', 'dave']
)

# join: left join on index (default)
result = profiles.join(scores)
print(result)
#        age  score
# alice   25   88.0
# bob     30    NaN   <- bob has no score
# carol   22   95.0

Sterowanie typem złączenia w join()

Przekaż parametr how do join(), aby określić, które wiersze mają zostać zachowane, podobnie jak w przypadku pd.merge(). Dostępne opcje to 'left' (domyślna), 'right', 'inner' i 'outer'. Na przykład how='inner' zachowuje tylko indeksy występujące w obu obiektach DataFrame, usuwając wiersz alice, jeśli nie ma on odpowiadającego indeksu w prawej tabeli.

# Inner join on index: only rows present in BOTH indices
print(profiles.join(scores, how='inner'))
#        age  score
# alice   25     88
# carol   22     70

# Outer join: all indices from both
print(profiles.join(scores, how='outer'))
#        age  score
# alice  25.0   88.0
# bob    30.0    NaN
# carol  22.0   70.0
# dave    NaN   95.0

Łączenie wielu obiektów DataFrame jednocześnie

Główną zaletą join() w porównaniu z pd.merge() jest możliwość przyjęcia listy obiektów DataFrame i połączenia ich wszystkich z obiektem wywołującym w jednym wywołaniu. Wszystkie obiekty DataFrame muszą mieć zgodne indeksy. Jest to bardzo wygodne, gdy mają Państwo wiele tabel cech indeksowanych tym samym kluczem, na przykład identyfikatorem użytkownika lub datą, i chcą złożyć je w jeden szeroki obiekt DataFrame.

emails = pd.DataFrame({'email': ['a@x.com', 'b@x.com', 'c@x.com']},
                      index=['alice', 'bob', 'carol'])
city  = pd.DataFrame({'city': ['NY', 'LA', 'SF']},
                     index=['alice', 'bob', 'carol'])

# Join multiple DataFrames at once
result = profiles.join([emails, city])
print(result)
#        age    email city
# alice   25  a@x.com   NY
# bob     30  b@x.com   LA
# carol   22  c@x.com   SF

Łączenie po kolumnie w jednej tabeli i indeksie w innej

pd.merge() pozwala łączyć dopasowywanie po kolumnie i po indeksie za pomocą left_on/right_index lub left_index/right_on. Jest to przydatne, gdy jeden obiekt DataFrame przechowuje klucz w kolumnie, a drugi używa go jako indeksu. Nie można tego osiągnąć za pomocą samego join().

# orders has customer_id as a column; customers is indexed by customer_id
customers_indexed = pd.DataFrame(
    {'name': ['Alice', 'Bob', 'Carol']},
    index=[101, 102, 103]
)
orders = pd.DataFrame({
    'order_id': [1, 2, 3],
    'customer_id': [101, 102, 101]
})

result = pd.merge(orders, customers_indexed,
                  left_on='customer_id', right_index=True)
print(result)
#    order_id  customer_id   name
# 0         1          101  Alice
# 2         3          101  Alice
# 1         2          102    Bob

Używanie left_index i right_index w merge()

Gdy oba obiekty DataFrame mają klucz w indeksie, użyj pd.merge(left, right, left_index=True, right_index=True). Jest to równoważne z join(), ale domyślnie używa typu łączenia 'inner' i ma bardziej jawne parametry. Zyskujesz również dostęp do wszystkich pozostałych parametrów pd.merge(), takich jak suffixes i indicator.

# Both DataFrames indexed by user_id
demog = pd.DataFrame({'age': [25, 30]}, index=[1, 2])
behav = pd.DataFrame({'clicks': [10, 5]}, index=[1, 2])

# Equivalent joins
result1 = demog.join(behav)  # left join
result2 = pd.merge(demog, behav, left_index=True, right_index=True)  # inner join

print(result1)
print(result2)

Dlaczego warto używać łączenia po indeksie?

Łączenie po indeksie jest preferowane, gdy obiekty DataFrame są naturalnie kluczowane za pomocą znaczącego identyfikatora, takiego jak identyfikator użytkownika, SKU produktu lub data. Używanie indeksu do łączenia pozwala uniknąć zaśmiecania obiektu DataFrame nadmiarowymi kolumnami kluczy i może być szybsze, ponieważ Pandas utrzymuje posortowane struktury indeksów umożliwiające wyszukiwanie w czasie O(log n). Takie łączenia są szczególnie częste w danych szeregów czasowych, gdzie naturalnym kluczem łączenia jest DatetimeIndex.

# Time series example: join temperature and humidity by date index
import numpy as np
dates = pd.date_range('2024-01-01', periods=5)
temp = pd.DataFrame({'temp_c': [10, 12, 9, 11, 13]}, index=dates)
humid = pd.DataFrame({'humidity': [65, 70, 60, 75, 68]}, index=dates)

weather = temp.join(humid)
print(weather.head())

Obsługa nakładających się nazw kolumn

Gdy oba obiekty DataFrame mają kolumny o tej samej nazwie (inne niż klucz), join() domyślnie zgłasza ValueError, chyba że podasz parametry lsuffix i rsuffix. Parametry te działają podobnie jak suffixes w pd.merge() — dodają ciąg znaków do nakładających się nazw kolumn odpowiednio z lewego i prawego obiektu DataFrame.

df_a = pd.DataFrame({'value': [1, 2]}, index=['x', 'y'])
df_b = pd.DataFrame({'value': [10, 20]}, index=['x', 'y'])

# Without suffixes: raises ValueError
# result = df_a.join(df_b)

# With suffixes: disambiguate column names
result = df_a.join(df_b, lsuffix='_left', rsuffix='_right')
print(result)
#    value_left  value_right
# x           1           10
# y           2           20

set_index przed łączeniem

Typowy sposób pracy polega na ustawieniu kolumny jako indeksu przed łączeniem, aby można było użyć składni join(). Po połączeniu reset_index() przywraca klucz jako zwykłą kolumnę. Ten schemat jest intuicyjny: awansuj klucz do indeksu, połącz dane, a następnie przywróć klucz — dzięki temu intencja kodu jest jasna dla osób, które będą go później czytać.

orders_col = pd.DataFrame({'order_id': [1,2,3], 'customer_id': [10,20,10], 'amount': [100,200,150]})
cust_col = pd.DataFrame({'customer_id': [10,20], 'name': ['Alice','Bob']})

result = (
    orders_col.set_index('customer_id')
    .join(cust_col.set_index('customer_id'), how='left')
    .reset_index()
)
print(result)

Dopasowywanie obiektu Series do indeksu DataFrame

Obiekt Series również ma indeks i można dodać go jako nową kolumnę do obiektu DataFrame za pomocą przypisania — Pandas automatycznie dopasuje wartości Series do odpowiadających im etykiet indeksu. Jest to uproszczona forma łączenia po indeksie, przydatna, gdy chcą Państwo dodać pojedynczą kolumnę z obiektu Series bez wywoływania merge() ani join().

df = pd.DataFrame({'sales': [100, 200, 150]}, index=['A', 'B', 'C'])
tax_rate = pd.Series({'A': 0.1, 'B': 0.2, 'C': 0.15})

# Index alignment: Series aligns to DataFrame index automatically
df['tax'] = df['sales'] * tax_rate
print(df)
#    sales   tax
# A    100  10.0
# B    200  40.0
# C    150  22.5

Wydajność łączenia po indeksie

Łączenie po posortowanym indeksie jest szybsze niż łączenie po zwykłej kolumnie, ponieważ Pandas używa wyszukiwania binarnego w posortowanym indeksie. Jeśli wielokrotnie łączysz dane po tym samym kluczu, ustaw ten klucz jako indeks raz, na początku potoku przetwarzania. Jest to szczególnie ważne w procesach pracy z szeregami czasowymi, w których łączysz dane po DatetimeIndex tysiące razy w wielu plikach.

# Sort index before repeated joins for speed
left = left.sort_index()
right = right.sort_index()

# Both sorted -> Pandas uses merge path with binary search
result = left.join(right, how='inner')

# Check if index is sorted
print('Left sorted:', left.index.is_monotonic_increasing)
print('Right sorted:', right.index.is_monotonic_increasing)

Szybkie sprawdzenie

Sprawdź swoją wiedzę na temat łączenia po indeksie z tego rozdziału.

Podsumowanie lekcji

W tej lekcji nauczyłeś się, że: DataFrame.join() domyślnie łączy dane po indeksie, używając lewego łączenia; pd.merge() z parametrami left_index=True/right_index=True zapewnia większą kontrolę; można łączyć wiele obiektów DataFrame jednocześnie, przekazując listę do join(); a użycie posortowanego indeksu poprawia wydajność łączenia. Następnie zajmiemy się przekształcaniem obiektów DataFrame za pomocą pivot_table.

Często zadawane pytania

Czy lekcja „Łączenie według indeksu” jest bezpłatna?

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

Użyj DataFrame.join() oraz ustaw left_index/right_index=True w merge(), aby połączyć obiekty DataFrame wyrównane według indeksu. Ć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 4 z 4.

Ile czasu zajmuje lekcja „Łączenie 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. pd.concat do układania DataFrame
  2. pd.merge: złączenia wewnętrzne i zewnętrzne
  3. Złączenia lewostronne i prawostronne
  4. Łączenie według indeksu
← Powrót do Pandas & NumPy Academy