Jak połączyć dwa DataFrame w Pandas?

Dowiedz się, jak skutecznie łączyć dwa DataFrame w Pandas przy użyciu metod merge, concat i join. Praktyczne przykłady i dobre praktyki! 💡
26 maja 2025
blog

Wprowadzenie do łączenia DataFrame w Pandas

Łączenie zbiorów danych to jedno z kluczowych zadań w analizie danych. W bibliotece Pandas dostępne są różne metody umożliwiające łączenie obiektów typu DataFrame, które pozwalają na elastyczne i efektywne manipulowanie strukturami danych. Dzięki nim można np. zestawiać dane z różnych źródeł, uzupełniać brakujące informacje lub przygotowywać dane do dalszej analizy.

W Pandas wyróżniamy trzy główne podejścia do łączenia DataFrame:

  • merge() – umożliwia łączenie danych podobnie jak w języku SQL, na podstawie jednej lub kilku kolumn (kluczy). Jest stosowane głównie przy relacyjnych operacjach między zbiorami.
  • concat() – służy do łączenia DataFrame'ów wzdłuż osi (wierszy lub kolumn). Nadaje się do sklejania danych o tej samej strukturze, np. zbiorów danych z różnych plików.
  • join() – metoda wywodząca się z serii i DataFrame, uproszczająca operacje dołączania kolumn na podstawie indeksów lub kluczy.

Każda z metod ma swoje specyficzne zastosowania i daje różne możliwości konfiguracji – od sposobu dopasowywania danych, przez obsługę brakujących wartości, aż po zarządzanie nazwami kolumn. Wybór odpowiedniej metody zależy od kontekstu problemu i struktury danych, którymi dysponujemy.

Dla przykładu, jeśli mamy dwa zestawy danych zawierające informacje o klientach i ich zamówieniach, możemy użyć merge(), aby powiązać je wspólnym identyfikatorem klienta. Natomiast jeżeli zbieraliśmy dane miesięczne w oddzielnych plikach i chcemy stworzyć jeden wspólny zbiór, concat() będzie bardziej odpowiedni.

Opanowanie metod łączenia DataFrame w Pandas pozwala znacząco zwiększyć efektywność pracy z danymi oraz umożliwia tworzenie bardziej złożonych analiz i zestawień.

Metoda merge() – zastosowanie i parametry

Metoda merge() w bibliotece Pandas służy do łączenia dwóch obiektów DataFrame na podstawie wspólnych kolumn lub indeksów, w sposób przypominający operacje JOIN w języku SQL. Jest to najbardziej elastyczne narzędzie łączenia danych, pozwalające na precyzyjne określenie logiki dopasowania rekordów.

merge() sprawdza się szczególnie wtedy, gdy chcemy połączyć dane na podstawie jednego lub wielu kluczy — czyli kolumn, które pełnią funkcję identyfikatorów. Daje możliwość kontrolowania rodzaju połączenia (np. wewnętrzne, zewnętrzne, lewe, prawe) oraz sposobu obsługi kolumn o takich samych nazwach w obu ramkach danych.

Najważniejsze parametry metody merge() to:

  • on – umożliwia określenie nazwy kolumny (lub listy kolumn), według której ma nastąpić łączenie.
  • left_on i right_on – służą do wskazania różnych kolumn w obu DataFrame, jeśli kolumny kluczowe mają inne nazwy.
  • how – definiuje typ łączenia: 'inner', 'outer', 'left' lub 'right'.
  • left_index i right_index – pozwalają na łączenie na podstawie indeksów zamiast kolumn.
  • suffixes – określa sufiksy dodawane do kolumn o takich samych nazwach, które nie są używane jako klucz.

Przykładowe użycie metody merge() może wyglądać następująco:

pd.merge(df1, df2, on='id', how='inner')

Powyższy kod łączy dwa DataFrame na podstawie kolumny 'id', stosując wewnętrzne dopasowanie, czyli zachowując tylko wspólne wiersze.

Metoda concat() – zastosowanie i parametry

concat() to jedna z podstawowych metod biblioteki Pandas służących do łączenia obiektów typu DataFrame lub Series. Jej głównym zastosowaniem jest sklejanie danych wzdłuż wskazanej osi – pionowo (domyślnie, oś 0) lub poziomo (oś 1). Metoda ta sprawdza się szczególnie dobrze w przypadku łączenia danych o podobnej strukturze kolumn lub indeksów bez potrzeby wskazywania kluczy łączenia. Jeśli chcesz dowiedzieć się więcej i nauczyć się pracy z danymi w praktyce, sprawdź Kurs Python - kompleksowa analiza danych w Pythonie z wykorzystaniem bibliotek Pandas, NumPy, Matplotlib i Scikit-Learn.

Podstawowe cechy metody concat():

  • Prostota użycia: idealna do szybkiego łączenia wielu obiektów Pandas.
  • Możliwość zachowania lub zresetowania indeksów: dzięki parametrom takim jak ignore_index czy keys.
  • Obsługa brakujących danych: kolumny lub indeksy nieistniejące w jednym z elementów zostaną uzupełnione wartościami NaN.

Najważniejsze parametry metody concat():

Parametr Opis
objs Lista lub słownik obiektów DataFrame/Series do połączenia.
axis Oś łączenia: 0 dla wierszy (domyślnie), 1 dla kolumn.
ignore_index Jeśli True, stare indeksy zostaną zignorowane, a nowe utworzone.
keys Dodaje poziom do hierarchii indeksu, przydatne przy łączeniu wielu obiektów.
join Typ połączenia: "outer" (domyślnie) lub "inner".
verify_integrity Jeśli True, sprawdza unikalność indeksów po łączeniu.

Przykład użycia:

import pandas as pd

# Dwa DataFrame o tych samych kolumnach
df1 = pd.DataFrame({"A": [1, 2], "B": [3, 4]})
df2 = pd.DataFrame({"A": [5, 6], "B": [7, 8]})

# Połączenie w pionie
result = pd.concat([df1, df2], ignore_index=True)
print(result)

Metoda concat() jest nieoceniona, gdy chcemy szybko skleić dane bez potrzeby ich dopasowywania względem określonych kolumn czy wartości kluczy.

Metoda join() – zastosowanie i parametry

Metoda join() w bibliotece Pandas służy do łączenia dwóch obiektów DataFrame na podstawie indeksów lub kolumny indeksowej. Jest to wygodny sposób na dołączanie danych z innego DataFrame, szczególnie gdy dane są już uporządkowane względem indeksów.

join() najlepiej sprawdza się, gdy chcemy dołączyć kolumny z innego DataFrame do istniejącego, bez konieczności explicite określania kolumny kluczowej – domyślnie operacja opiera się na indeksie.

Podstawowe zastosowania metody join() to m.in.:

  • łączenie danych na podstawie indeksów,
  • szybkie rozszerzanie DataFrame o dodatkowe informacje z innego DataFrame,
  • łączenie wielu kolumn jednocześnie.

Wybrane parametry join(), które wpływają na działanie metody:

Parametr Opis
other Obiekt DataFrame, który ma zostać dołączony.
on Kolumna lub lista kolumn, na podstawie których wykona się łączenie (zamiast indeksu).
how Typ złączenia: 'left' (domyślny), 'right', 'outer' lub 'inner'.
lsuffix / rsuffix Sufiksy dodawane do kolidujących nazw kolumn z lewej/prawej ramki.

Przykład użycia:

import pandas as pd

df1 = pd.DataFrame({
    'A': [1, 2, 3]
}, index=['a', 'b', 'c'])

df2 = pd.DataFrame({
    'B': [4, 5, 6]
}, index=['a', 'b', 'c'])

# Łączenie po indeksie (domyślnie 'left join')
result = df1.join(df2)
print(result)

Wynik:

   A  B
a  1  4
b  2  5
c  3  6

join() jest alternatywą dla merge(), szczególnie gdy dane są zorganizowane według indeksów i nie wymagają złożonych warunków łączenia.

Porównanie metod merge(), concat() i join()

W bibliotece Pandas dostępne są trzy główne sposoby łączenia obiektów typu DataFrame: merge(), concat() oraz join(). Każda z tych metod ma swoje charakterystyczne zastosowania oraz różnice w działaniu. Poniżej przedstawiamy ich krótkie porównanie:

Metoda Główne zastosowanie Typ łączenia Wymaga klucza? Podobna do SQL?
merge() Łączenie na podstawie wspólnych kolumn lub indeksów Poziome (kolumnowe) Tak Tak (JOIN)
concat() Sklejanie DataFrame'ów wzdłuż osi (góra-dół lub bok) Pionowe lub poziome Nie zawsze Nie
join() Łączenie na podstawie indeksów lub określonych kolumn Poziome (kolumnowe) Tak (indeks lub kolumna) Częściowo

merge() jest najbardziej elastyczną metodą, przypominającą operacje JOIN w SQL. Pozwala łączyć dane po kolumnach lub indeksach, z różnymi typami złączeń: wewnętrznym (inner), zewnętrznym (outer), lewym (left) i prawym (right).

concat() służy do łączenia wielu obiektów DataFrame wzdłuż osi — najczęściej w pionie (dodawanie wierszy) lub poziomie (dodawanie kolumn). Nie wymaga podania klucza, ale ważne są zgodne indeksy lub kolumny.

join() to wygodna metoda do łączenia DataFrame’ów po ich indeksach (domyślnie), ale pozwala również na wskazanie kolumny jako klucza. Jest często używana jako skrócona forma merge().

Przykładowe użycie każdej z metod może wyglądać następująco:

# merge()
pd.merge(df1, df2, on='id', how='inner')

# concat()
pd.concat([df1, df2], axis=0)

# join()
df1.join(df2, on='id', how='left')

Dobór odpowiedniej metody zależy od struktury danych oraz celu, jaki chcemy osiągnąć – czy potrzebujemy połączyć dane według klucza, czy po prostu je skleić. Jeśli chcesz nauczyć się wykorzystywać te techniki w praktyce, sprawdź nasz Kurs Python - praktyczne wykorzystanie Pythona do analizy danych i automatyzacji.

💡 Pro tip: Wybieraj merge do złączeń po kolumnach/indeksach, concat do doklejania wierszy lub kolumn, a join gdy łączysz po indeksie. Używaj suffixes i validate w merge oraz keys w concat, aby uniknąć kolizji nazw i śledzić pochodzenie danych.

Praktyczne przykłady kodu łączenia DataFrame

Łączenie dwóch lub więcej obiektów DataFrame w Pandas można przeprowadzić na różne sposoby, w zależności od celu i struktury danych. Poniżej znajdują się przykłady ilustrujące zastosowanie najpopularniejszych metod: merge(), concat() i join(). Każda z tych metod służy innemu celowi, np. dopasowywaniu danych po kluczach, łączeniu w pionie/horyzoncie lub łączeniu po indeksie.

1. Łączenie z użyciem merge()

Typowe dla relacyjnych operacji typu SQL, gdzie łączymy dwa DataFrame na podstawie wspólnych kolumn (kluczy):

import pandas as pd

customers = pd.DataFrame({
    'customer_id': [1, 2, 3],
    'name': ['Anna', 'Piotr', 'Kasia']
})

orders = pd.DataFrame({
    'order_id': [100, 101, 102],
    'customer_id': [2, 3, 2]
})

merged = pd.merge(customers, orders, on='customer_id')
print(merged)

2. Łączenie z użyciem concat()

Stosowane głównie do łączenia DataFrame wzdłuż osi (wertykalnie lub horyzontalnie), bez dopasowywania kluczy:

df1 = pd.DataFrame({'A': ['A0', 'A1'], 'B': ['B0', 'B1']})
df2 = pd.DataFrame({'A': ['A2', 'A3'], 'B': ['B2', 'B3']})

concatenated = pd.concat([df1, df2])
print(concatenated)

3. Łączenie z użyciem join()

Wygodne do łączenia DataFrame na podstawie indeksów, bez konieczności podawania wspólnych kolumn:

df_left = pd.DataFrame({'A': ['A0', 'A1']}, index=['k1', 'k2'])
df_right = pd.DataFrame({'B': ['B0', 'B1']}, index=['k1', 'k2'])

joined = df_left.join(df_right)
print(joined)

Podsumowanie zastosowań:

Metoda Typ łączenia Podstawa łączenia
merge() Relacyjne (jak SQL JOIN) Kolumny (klucze)
concat() Dodawanie danych (w pionie lub poziomie) Indeksy lub bez dopasowań
join() Proste łączenie wg indeksu Indeks

Dzięki tym metodom Pandas umożliwia elastyczne manipulowanie i integrowanie danych w różnych formatach i strukturach.

Obsługa duplikatów i brakujących danych po połączeniu

Łączenie dwóch lub więcej obiektów DataFrame w Pandas może prowadzić do pojawienia się duplikatów w wierszach lub kolumnach, a także do powstania brakujących danych (oznaczanych jako NaN). Zrozumienie, jak sobie z nimi radzić, jest kluczowe dla zachowania spójności i jakości danych.

Duplikaty mogą powstać, gdy dane się pokrywają – np. gdy dane z dwóch źródeł zawierają te same identyfikatory lub wiersze. W takich przypadkach warto rozważyć usunięcie powtórzeń, używając metod takich jak drop_duplicates(), albo świadomie je zachować, jeśli są potrzebne do dalszych analiz.

Brakujące dane pojawiają się zazwyczaj wtedy, gdy nie wszystkie połączone DataFrame posiadają wspólne kolumny lub indeksy. Pandas automatycznie wypełnia brakujące miejsca wartością NaN, co może wpłynąć na działanie późniejszych operacji analitycznych. Aby sobie z tym poradzić, można wykorzystać metody takie jak fillna() do uzupełniania braków domyślnymi wartościami albo dropna() do usuwania niekompletnych wierszy lub kolumn.

Warto pamiętać, że odpowiednie podejście do duplikatów i braków zależy od kontekstu analizy oraz charakteru danych. Czasami pozostawienie NaN może być uzasadnione, a innym razem konieczne będzie ich przekształcenie lub eliminacja.

💡 Pro tip: Przed łączeniem sprawdź unikalność kluczy lub najpierw zagreguj dane, aby uniknąć karteskich duplikacji; po operacji przeaudytuj duplikaty, używając duplicated, value_counts albo indicator=True w merge. Braki uzupełniaj kontekstowo przez fillna lub usuwaj dropna tylko w krytycznych kolumnach, by nie tracić cennych rekordów.

Najlepsze praktyki i podsumowanie

Łączenie DataFrame w Pandas to jedna z kluczowych umiejętności przy pracy z danymi w Pythonie. Wybór odpowiedniej metody zależy od struktury danych oraz od zamierzonego efektu końcowego. Wśród najczęściej używanych technik znajdują się merge(), concat() oraz join(), z których każda oferuje inne możliwości.

Oto kilka najlepszych praktyk, które warto mieć na uwadze:

  • Zrozum relację między zbiorami danych: czy dane mają wspólne klucze? Czy chcesz je zestawiać w poziomie czy w pionie?
  • Dobierz metodę do przypadku: merge() stosuj przy łączeniu po wspólnych kolumnach (kluczach), concat() gdy chcesz „skleić” DataFrame pionowo lub poziomo, a join() do wygodnego łączenia po indeksie.
  • Uważaj na nazwy kolumn: kolizje nazw kolumn mogą prowadzić do nieoczekiwanych rezultatów — warto je wcześniej ujednolicić lub zmodyfikować.
  • Sprawdź indeksy: wiele operacji domyślnie bazuje na indeksach — upewnij się, czy są one sensownie ustawione przed łączeniem danych.
  • Unikaj nieświadomego powielania danych: połączenie bez odpowiednich warunków może prowadzić do duplikacji rekordów lub karteskich iloczynów.
  • Weryfikuj wyniki: po każdej operacji łączenia warto sprawdzić kształt oraz próbkę danych, np. za pomocą df.info() i df.head().

Stosując te zasady, łatwiej osiągniesz czytelny i spójny wynik końcowy, niezależnie od tego, czy pracujesz z prostymi tabelami, czy złożonymi strukturami danych. Umiejętne łączenie DataFrame pozwala efektywnie integrować informacje z różnych źródeł i przygotowywać dane do dalszej analizy lub wizualizacji.

💡 Pro tip: Ustal spójne typy i nazwy kolumn przed łączeniem oraz upewnij się, że indeksy i klucze są poprawnie ustawione. Po każdej operacji sprawdź kształt i próbkę danych (df.info, df.head) oraz liczności kluczy, a podejrzane przypadki testuj najpierw na małej próbce.

Majczęściej zadawane pytania i odpowiedzi odnośnie Jak połączyć dwa DataFrame w Pandas?

Kiedy lepiej użyć merge() zamiast concat() w Pandas?

merge() wybierz wtedy, gdy chcesz połączyć dane na podstawie wspólnego klucza. Ta metoda działa podobnie do złączeń SQL i sprawdza się przy relacjach między tabelami, na przykład po identyfikatorze. concat() jest lepsze wtedy, gdy chcesz po prostu skleić DataFrame w pionie lub poziomie, bez dopasowywania rekordów według konkretnej kolumny.

Czym różni się join() od merge() w Pandas?

join() jest prostszą metodą do łączenia głównie po indeksie, a merge() daje większą elastyczność. Jeśli dane są już dobrze ustawione względem indeksów, join() pozwala szybko dołączyć kolumny z innego DataFrame. merge() lepiej sprawdza się wtedy, gdy musisz jawnie wskazać kolumny kluczowe, typ złączenia lub połączyć dane o bardziej relacyjnej strukturze.

Jak połączyć dwa DataFrame po różnych nazwach kolumn?

Do połączenia po różnych nazwach kolumn używa się w Pandas parametrów left_on i right_on w metodzie merge(). To rozwiązanie przydaje się wtedy, gdy obie ramki danych przechowują ten sam klucz, ale pod inną nazwą. Dzięki temu nie trzeba wcześniej zmieniać nazw kolumn, a logika łączenia pozostaje czytelna i łatwa do kontrolowania.

Jakie typy łączenia można ustawić w merge()?

W merge() możesz użyć typów inner, outer, left i right. Każdy z nich decyduje, które rekordy zostaną zachowane po połączeniu. Najczęściej stosuje się:

  • inner – tylko wspólne wiersze,
  • left – wszystkie wiersze z lewej ramki,
  • right – wszystkie wiersze z prawej ramki,
  • outer – wszystkie wiersze z obu ramek.

Jak połączyć dwa DataFrame po indeksie w Pandas?

Najprościej połączyć DataFrame po indeksie za pomocą join() albo merge() z parametrami left_index i right_index. join() jest wygodne, gdy chcesz szybko dołączyć kolumny i dane są już ustawione względem indeksów. merge() daje podobny efekt, ale zapewnia więcej kontroli nad sposobem łączenia i dodatkowymi parametrami operacji.

Skąd biorą się wartości NaN po połączeniu DataFrame?

Wartości NaN pojawiają się wtedy, gdy połączone DataFrame nie mają pełnego dopasowania kolumn, indeksów lub kluczy. Pandas uzupełnia brakujące miejsca pustymi wartościami, aby zachować strukturę wyniku. Po takiej operacji można przeanalizować braki i zdecydować, czy lepiej je zostawić, uzupełnić przez fillna(), czy usunąć wybrane rekordy za pomocą dropna().

Jak uniknąć duplikatów podczas łączenia DataFrame w Pandas?

Aby uniknąć duplikatów, trzeba sprawdzić klucze i strukturę danych jeszcze przed połączeniem. Problemy zwykle pojawiają się wtedy, gdy klucze nie są unikalne lub gdy relacja między tabelami powoduje zwielokrotnienie rekordów. Pomocne działania to:

  • kontrola unikalności kluczy,
  • wstępna agregacja danych,
  • audyt wyniku po połączeniu,
  • usunięcie nadmiarowych wierszy przez drop_duplicates().

Na co zwrócić uwagę po połączeniu dwóch DataFrame?

Po połączeniu DataFrame trzeba sprawdzić, czy wynik ma oczekiwany kształt i poprawne dopasowanie danych. Dobrą praktyką jest przejrzenie próbki rekordów oraz kontrola indeksów, nazw kolumn i liczby wierszy. Warto też upewnić się, czy nie pojawiły się nieoczekiwane duplikaty, kolizje nazw kolumn albo brakujące wartości, które mogą wpłynąć na dalszą analizę.

icon

Formularz kontaktowyContact form

Imię *Name
NazwiskoSurname
Adres e-mail *E-mail address
Telefon *Phone number
UwagiComments