Łą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.0Sterowanie 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 BobUż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 20set_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.5Wydajność łą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
- pd.concat do układania DataFrame
- pd.merge: złączenia wewnętrzne i zewnętrzne
- Złączenia lewostronne i prawostronne
- Łączenie według indeksu