Jaka jest zasadnicza różnica (y) między pd.DataFrame.merge()
i pd.concat()
?
Jak dotąd znalazłem to, proszę o komentarz, jak kompletne i dokładne jest moje zrozumienie:
.merge()
może używać tylko kolumn (plus indeksów wierszy) i jest semantycznie odpowiedni dla operacji w stylu bazy danych..concat()
może być używany z każdą osią, używając tylko indeksów, i daje możliwość dodania indeksu hierarchicznego.Nawiasem mówiąc, pozwala to na następującą nadmiarowość: obie mogą łączyć dwie ramki danych przy użyciu indeksów wierszy.
pd.DataFrame.join()
oferuje jedynie skrót dla podzbioru przypadków użycia.merge()
(Pandy świetnie radzą sobie z bardzo szerokim spektrum przypadków użycia w analizie danych. Przeglądanie dokumentacji w celu ustalenia, jaki jest najlepszy sposób wykonania określonego zadania, może być nieco zniechęcające).
.merge()
i.join()
.Odpowiedzi:
Bardzo duża różnica poziomów
merge()
jest używana do łączenia dwóch (lub więcej) ramek danych na podstawie wartości wspólnych kolumn (można również używać indeksów, używaćleft_index=True
i / lubright_index=True
) iconcat()
służy do dołączania jednej (lub więcej) ramek danych poniżej drugiego (lub na boki, w zależności od tego, czyaxis
opcja jest ustawiona na 0 czy 1).join()
służy do łączenia 2 ramek danych na podstawie indeksu; zamiast używaćmerge()
z opcją,left_index=True
której możemy użyćjoin()
.Na przykład:
df1 = pd.DataFrame({'Key': ['b', 'b', 'a', 'c', 'a', 'a', 'b'], 'data1': range(7)}) df1: Key data1 0 b 0 1 b 1 2 a 2 3 c 3 4 a 4 5 a 5 6 b 6 df2 = pd.DataFrame({'Key': ['a', 'b', 'd'], 'data2': range(3)}) df2: Key data2 0 a 0 1 b 1 2 d 2 #Merge # The 2 dataframes are merged on the basis of values in column "Key" as it is # a common column in 2 dataframes pd.merge(df1, df2) Key data1 data2 0 b 0 1 1 b 1 1 2 b 6 1 3 a 2 0 4 a 4 0 5 a 5 0 #Concat # df2 dataframe is appended at the bottom of df1 pd.concat([df1, df2]) Key data1 data2 0 b 0 NaN 1 b 1 NaN 2 a 2 NaN 3 c 3 NaN 4 a 4 NaN 5 a 5 NaN 6 b 6 NaN 0 a Nan 0 1 b Nan 1 2 d Nan 2
źródło
how
wmerge
pracach i oznaczają zupełnie inny niż to, co robi wconcat
?pd.concat
przyjmujeIterable
jako argument. W związku z tym nie może przyjmowaćDataFrame
s bezpośrednio jako argumentu. RównieżDimension
elementyDataFrame
powinny pasować wzdłuż osi podczas konkatenacji.pd.merge
może przyjąćDataFrame
s jako argument i jest używany do łączenia dwóchDataFrame
s z tymi samymi kolumnami lub indeksem, czego nie można zrobić,pd.concat
ponieważ spowoduje wyświetlenie powtórzonej kolumny w DataFrame.Natomiast złączenia można użyć do połączenia dwóch
DataFrame
z różnymi indeksami.źródło
concat
to nic innego jak przyklejenie kilku ramek danych jedna nad drugą / obok siebie. Nie jest świadomy treści w tym sensie, że po prostu pokaże tę samą kolumnę dwa razy. Natomiastmerge
faktycznie połączy kolumny, gdy będą takie same.concat
gdzie wymiary nie pasują.Fajne pytanie. Podstawowa różnica:
pd.concat
działa na obu osiach.Inną różnicą jest to, że
pd.concat
ma tylko wewnętrzne domyślne i zewnętrzne łączenia, podczas gdypd.DataFrame.merge()
ma lewe , prawe , zewnętrzne i wewnętrzne domyślne łączenia.Trzecia zauważalna inna różnica to:
pd.DataFrame.merge()
ma możliwość ustawienia sufiksów kolumn podczas łączenia kolumn o tej samej nazwie, podczas gdypd.concat
nie jest to możliwe.Z
pd.concat
domyślnie jesteś w stanie układać wiersze wielu dataframes (axis=0
) i po ustawieniuaxis=1
wtedy naśladowaćpd.DataFrame.merge()
funkcji.Kilka przydatnych przykładów
pd.concat
:df2=pd.concat([df]*2, ignore_index=True) #double the rows of a dataframe df2=pd.concat([df, df.iloc[[0]]]) # add first row to the end df3=pd.concat([df1,df2], join='inner', ignore_index=True) # concat two df's
źródło
Na wysokim poziomie:
.concat()
po prostu układa wieleDataFrame
razem w pionie lub zszywa poziomo po wyrównaniu na indeksie.merge()
najpierw wyrównuje dwieDataFrame
wybrane wspólne kolumny lub indeks, a następnie wybiera pozostałe kolumny z wyrównanych wierszy każdej z nichDataFrame
.A dokładniej
.concat()
:DataFrame
pionowo lub poziomoDataFrame
zawiera zduplikowany indeks.Oraz
.merge()
:DataFrame
metoda (od pandy 1.0)DataFrame
poziomieDataFrame
„s kolumnowej (S), albo z innym indeksemDataFrame
” a kolumna (-y) lub indeksZwróć uwagę, że podczas wykonywania
pd.merge(left, right)
, jeślileft
ma dwa wiersze zawierające te same wartości z łączących się kolumn lub indeksu, każdy wiersz zostanie połączony zright
odpowiadającym mu wierszem ( wierszami ), dając w wyniku iloczyn kartezjański. Z drugiej strony, jeśli.concat()
jest używany do łączenia kolumn, musimy upewnić się, że w żadnym z nich nie ma zduplikowanego indeksuDataFrame
.Praktycznie rzecz biorąc:
.concat()
najpierw przy łączeniu jednorodnychDataFrame
, a.merge()
najpierw rozważ łączenie komplementarneDataFrame
..concat()
. Jeśli chcesz scalić w poziomie za pomocą kolumn, użyj.merge()
, które domyślnie łączą się na wspólnych kolumnach.Źródła : Pandas 1.x Cookbook
źródło
Główna różnica między scalaniem i konkatencją polega na tym, że funkcja merge umożliwia wykonywanie bardziej ustrukturyzowanego „łączenia” tabel, w których użycie konkatacji jest szersze i mniej ustrukturyzowane.
Łączyć
Odwołując się do dokumentacji ,
pd.DataFrame.merge
przyjmuje się rację jako wymagany argument, który można uznać za łączenie lewej tabeli i prawej tabeli zgodnie z pewną wstępnie zdefiniowaną operacją łączenia. Zwróć uwagę na definicję parametru right .Wymagane parametry
Parametry opcjonalne
Ważne:
pd.DataFrame.merge
wymaga prawa do byciapd.DataFrame
lub nazwanympd.Series
obiektem.Wynik
Ponadto, jeśli sprawdzimy, jak poniżej znajduje się dokumentacja operacji scalania na pandach:
Concat
Odnoszą się do dokumentacji z
pd.concat
, pierwszej nuty, że parametr nie jest nazwany któregokolwiek z tabeli, data_frame, seria, matrycy itp, ale OBJS zamiast. Oznacza to, że możesz przekazać wiele „kontenerów danych”, które są zdefiniowane jako:Iterable[FrameOrSeriesUnion], Mapping[Optional[Hashable], FrameOrSeriesUnion]
Wymagane parametry
Parametry opcjonalne
Wynik
Przykład
Kod
import pandas as pd v1 = pd.Series([1, 5, 9, 13]) v2 = pd.Series([10, 100, 1000, 10000]) v3 = pd.Series([0, 1, 2, 3]) df_left = pd.DataFrame({ "v1": v1, "v2": v2, "v3": v3 }) df_right = pd.DataFrame({ "v4": [5, 5, 5, 5], "v5": [3, 2, 1, 0] }) df_concat = pd.concat([v1, v2, v3]) # Performing operations on default merge_result = df_left.merge(df_right, left_index=True, right_index=True) concat_result = pd.concat([df_left, df_right], sort=False) print(merge_result) print('='*20) print(concat_result)
Kod wyjściowy
v1 v2 v3 v4 v5 0 1 10 0 5 3 1 5 100 1 5 2 2 9 1000 2 5 1 3 13 10000 3 5 0 ==================== v1 v2 v3 v4 v5 0 1.0 10.0 0.0 NaN NaN 1 5.0 100.0 1.0 NaN NaN 2 9.0 1000.0 2.0 NaN NaN 3 13.0 10000.0 3.0 NaN NaN 0 NaN NaN NaN 5.0 3.0 1 NaN NaN NaN 5.0 2.0 2 NaN NaN NaN 5.0 1.0
Możesz jednak osiągnąć pierwsze wyjście (scalenie) z konkatacją poprzez zmianę parametru osi
concat_result = pd.concat([df_left, df_right], sort=False, axis=1)
Obserwuj następujące zachowanie,
concat_result = pd.concat([df_left, df_right, df_left, df_right], sort=False)
wyjścia;
v1 v2 v3 v4 v5 0 1.0 10.0 0.0 NaN NaN 1 5.0 100.0 1.0 NaN NaN 2 9.0 1000.0 2.0 NaN NaN 3 13.0 10000.0 3.0 NaN NaN 0 NaN NaN NaN 5.0 3.0 1 NaN NaN NaN 5.0 2.0 2 NaN NaN NaN 5.0 1.0 3 NaN NaN NaN 5.0 0.0 0 1.0 10.0 0.0 NaN NaN 1 5.0 100.0 1.0 NaN NaN 2 9.0 1000.0 2.0 NaN NaN 3 13.0 10000.0 3.0 NaN NaN 0 NaN NaN NaN 5.0 3.0 1 NaN NaN NaN 5.0 2.0 2 NaN NaN NaN 5.0 1.0 3 NaN NaN NaN 5.0 0.0
, którego nie można wykonać podobnej operacji z scalaniem, ponieważ zezwala tylko na pojedynczą ramkę DataFrame lub nazwaną Series.
merge_result = df_left.merge([df_right, df_left, df_right], left_index=True, right_index=True)
wyjścia;
TypeError: Can only merge Series or DataFrame objects, a <class 'list'> was passed
Wniosek
Jak już być może zauważyłeś, dane wejściowe i wyjściowe mogą różnić się między „scalaniem” i „łączeniem”.
Jak wspomniałem na początku, pierwszą (główną) różnicą jest to, że "merge" wykonuje bardziej ustrukturyzowane złączenie z zestawem ograniczonych obiektów i parametrów, gdzie "concat" wykonuje mniej ścisłe / szersze złączenie z szerszym zestawem obiektów i parametrów.
Podsumowując, scalanie jest mniej tolerancyjne na zmiany / (dane wejściowe), a „konkatacja” jest luźniejsze / mniej wrażliwe na zmiany / (dane wejściowe). Możesz osiągnąć „scalanie” za pomocą „konkatacji”, ale nie zawsze jest odwrotnie.
Operacja „Scal” wykorzystuje kolumny ramek danych (lub nazwy
pd.Series
obiektu) lub indeksy wierszy, a ponieważ używa tylko tych jednostek, wykonuje poziome scalanie ramek danych lub serii i nie stosuje w rezultacie operacji pionowych.Jeśli chcesz zobaczyć więcej, możesz trochę zagłębić się w kod źródłowy;
źródło
domyślnie:
złączenie jest złączeniem lewostronnym z
podziałem na kolumny
pd. merge jest złączeniem wewnętrznym z podziałem na kolumny pd.concat jest złączeniem zewnętrznym z podziałem na wiersze
pd.concat:
pobiera iterowalne argumenty. Dlatego nie może bezpośrednio pobierać DataFrame (użyj [df, df2])
Wymiary DataFrame powinny być zgodne wzdłuż osi
Join i pd.merge:
mogą przyjmować argumenty DataFrame
Kliknij, aby zobaczyć zdjęcie, aby zrozumieć, dlaczego poniższy kod robi to samo
df1.join(df2) pd.merge(df1, df2, left_index=True, right_index=True) pd.concat([df1, df2], axis=1)
źródło