pd.concat do układania DataFrame
Układaj obiekty DataFrame pionowo lub poziomo za pomocą pd.concat, dopasowuj je według indeksu lub kolumn i obsługuj zduplikowane indeksy.
pd.concat do układania DataFrame 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 łączyć DataFrame?
W rzeczywistych projektach dane rzadko pochodzą z jednego pliku. Mogą Państwo mieć miesięczne pliki sprzedażowe, eksporty ankiet regionalnych albo wyniki zapytań do bazy danych podzielone na wiele zapytań. Łączenie układa te oddzielne DataFrame w jedną połączoną tabelę. Pandas udostępnia do tego celu pd.concat(), obsługując zarówno łączenie pionowe (wierszami), jak i poziome (kolumnami).
Podstawowe łączenie pionowe
Najczęstszym zastosowaniem pd.concat() jest pionowe układanie DataFrame (dodawanie kolejnych wierszy). Należy przekazać listę DataFrame, a funkcja dołączy je jeden pod drugim. Aby uzyskać poprawny wynik, oba DataFrame powinny mieć zgodne kolumny. Pandas automatycznie dopasowuje kolumny według nazw, a brakujące kolumny wypełnia wartościami NaN.
import pandas as pd
jan = pd.DataFrame({'product': ['A', 'B'], 'sales': [100, 200]})
feb = pd.DataFrame({'product': ['A', 'C'], 'sales': [150, 120]})
combined = pd.concat([jan, feb])
print(combined)
# product sales
# 0 A 100
# 1 B 200
# 0 A 150
# 1 C 120Resetowanie indeksu po concat
Proszę zauważyć, że pd.concat() zachowuje oryginalne indeksy z każdego DataFrame, co może prowadzić do zduplikowanych wartości indeksu (jak powyżej, gdzie dwa wiersze mają indeks 0, a dwa kolejne indeks 1). Należy przekazać ignore_index=True, aby utworzyć w połączonym wyniku nowy, sekwencyjny indeks całkowity — niemal zawsze jest to oczekiwane zachowanie.
combined = pd.concat([jan, feb], ignore_index=True)
print(combined)
# product sales
# 0 A 100
# 1 B 200
# 2 A 150
# 3 C 120
print(combined.index)
# RangeIndex(start=0, stop=4, step=1)Śledzenie źródła za pomocą keys
Podczas łączenia danych z wielu źródeł mogą Państwo chcieć wiedzieć, z którego oryginalnego DataFrame pochodzi każdy wiersz. Należy przekazać parametr keys wraz z listą etykiet. Pandas utworzy MultiIndex, którego zewnętrzny poziom identyfikuje źródło. Następnie można użyć .loc['label'], aby uzyskać dostęp do wierszy z konkretnego źródła.
combined = pd.concat([jan, feb], keys=['January', 'February'])
print(combined)
# product sales
# January 0 A 100
# 1 B 200
# February 0 A 150
# 1 C 120
# Access only February rows
print(combined.loc['February'])Łączenie poziome za pomocą axis=1
Należy przekazać axis=1, aby połączyć DataFrame obok siebie (dodając kolejne kolumny). Pandas dopasowuje dane według indeksu wierszy, dlatego oba DataFrame powinny mieć ten sam indeks, aby uzyskać poprawny wynik. Jeśli indeksy się różnią, niedopasowane wiersze zostaną wypełnione wartościami NaN. Jest to przydatne podczas łączenia cech obliczonych z tego samego zbioru danych w osobnych krokach.
names = pd.DataFrame({'name': ['Alice', 'Bob', 'Carol']}, index=[1, 2, 3])
scores = pd.DataFrame({'score': [95, 88, 72]}, index=[1, 2, 3])
combined = pd.concat([names, scores], axis=1)
print(combined)
# name score
# 1 Alice 95
# 2 Bob 88
# 3 Carol 72Obsługa niezgodnych kolumn
Jeśli łączone DataFrame mają różne kolumny, Pandas zachowuje wszystkie kolumny i wypełnia brakujące wartościami NaN. To domyślne zachowanie join='outer'. Jeśli chcą Państwo zachować wyłącznie kolumny występujące we wszystkich DataFrame, należy przekazać join='inner', co usunie każdą kolumnę nieobecną w którymkolwiek źródle.
df1 = pd.DataFrame({'a': [1, 2], 'b': [3, 4]})
df2 = pd.DataFrame({'b': [5, 6], 'c': [7, 8]})
# Outer join (default): keeps all columns
print(pd.concat([df1, df2], ignore_index=True))
# a b c
# 0 1.0 3 NaN
# 1 2.0 4 NaN
# 2 NaN 5 7.0
# 3 NaN 6 8.0
# Inner join: keeps only shared columns
print(pd.concat([df1, df2], join='inner', ignore_index=True))
# b
# 0 3
# 1 4
# 2 5
# 3 6Łączenie wielu plików w pętli
Typowy wzorzec podczas wczytywania wielu plików polega na zebraniu wszystkich DataFrame na liście i jednokrotnym wywołaniu pd.concat() na końcu. Należy unikać łączenia wewnątrz pętli (np. df = pd.concat([df, new_chunk])), ponieważ przy każdej iteracji tworzona jest nowa kopia DataFrame, co w przypadku dużych zbiorów prowadzi do kwadratowej złożoności czasowej.
import glob
# Efficient: collect first, concat once
files = glob.glob('data/sales_*.csv')
frames = [pd.read_csv(f) for f in files]
combined = pd.concat(frames, ignore_index=True)
# Inefficient (avoid):
# result = pd.DataFrame()
# for f in files:
# result = pd.concat([result, pd.read_csv(f)]) # slow!Łączenie Series
pd.concat() działa zarówno z Series, jak i z DataFrame. Pionowe połączenie listy Series daje dłuższy Series. Łączenie z axis=1 tworzy DataFrame, w którym każda Series staje się kolumną. Series są dopasowywane według indeksu, dlatego etykiety indeksu muszą się zgadzać, aby uzyskać poprawne łączenie poziome.
s1 = pd.Series([1, 2, 3], name='x')
s2 = pd.Series([4, 5, 6], name='y')
# Vertical: one long Series
print(pd.concat([s1, s2]))
# 0 1
# 1 2
# ...
# Horizontal: a DataFrame with two columns
print(pd.concat([s1, s2], axis=1))
# x y
# 0 1 4
# 1 2 5
# 2 3 6Weryfikowanie połączonego wyniku
Po połączeniu należy zawsze sprawdzić, czy wynik ma oczekiwany kształt i nie zawiera nieoczekiwanych wartości NaN. Szybki schemat kontroli poprawności: porównać liczbę połączonych wierszy z sumą liczby wierszy poszczególnych DataFrame oraz wywołać isna().sum(), aby znaleźć niezamierzone brakujące wartości wprowadzone przez niedopasowanie kolumn. Kontrole te zapobiegają przenikaniu niezauważonych problemów z jakością danych do dalszej analizy.
combined = pd.concat([jan, feb], ignore_index=True)
# Sanity checks
assert len(combined) == len(jan) + len(feb), 'Row count mismatch'
print('Missing values per column:')
print(combined.isna().sum())
print('Shape:', combined.shape)concat a append (przestarzałe)
Starszy kod Pandas może używać df.append(other), które było wygodnym opakowaniem dla pd.concat(). Metoda ta została oznaczona jako przestarzała w Pandas 1.4 i usunięta w Pandas 2.0. We współczesnym kodzie należy zawsze używać pd.concat([df, other], ignore_index=True). Zachowanie jest identyczne, ale pd.concat jest bardziej jednoznaczne i obsługuje łączenie więcej niż dwóch DataFrame jednocześnie.
# Old (removed in Pandas 2.0):
# combined = jan.append(feb, ignore_index=True)
# Modern equivalent:
combined = pd.concat([jan, feb], ignore_index=True)
print(combined)Praktyczny przykład: roczny raport sprzedaży
Oto realistyczny wzorzec: wczytać miesięczne DataFrame, dodać etykietę źródła, połączyć dane i obliczyć podsumowanie całego roku. Parametr keys ułatwia prześledzenie każdego wiersza aż do jego miesiąca, a ignore_index=True w połączeniu z kolumną miesiąca daje czysty, płaski DataFrame do analizy grupowej.
months = ['jan', 'feb', 'mar']
frames = []
for m in months:
df = pd.DataFrame({'product': ['A', 'B'], 'sales': [100, 200]})
df['month'] = m
frames.append(df)
yearly = pd.concat(frames, ignore_index=True)
print(yearly.groupby('month')['sales'].sum())Szybkie sprawdzenie
Sprawdź swoje zrozumienie pd.concat służącego do łączenia DataFrame omówionego w tej lekcji.
Podsumowanie lekcji
W tej lekcji nauczyli się Państwo: jak łączyć ramki danych pionowo za pomocą pd.concat() i ignore_index=True, jak śledzić źródła za pomocą parametru keys oraz jak ustawienie join='inner' vs 'outer' wpływa na obsługę kolumn, gdy schematy się różnią. Następnie omówimy pd.merge() do wykonywania złączeń wewnętrznych i zewnętrznych w stylu SQL na wspólnych kolumnach kluczy.
Często zadawane pytania
Czy lekcja „pd.concat do układania DataFrame” jest bezpłatna?
Tak — pełny tekst „pd.concat do układania DataFrame” 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 „pd.concat do układania DataFrame”?
Układaj obiekty DataFrame pionowo lub poziomo za pomocą pd.concat, dopasowuj je według indeksu lub kolumn i obsługuj zduplikowane indeksy. Ć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 „pd.concat do układania DataFrame”?
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