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
- po prawej : DataFrame lub nazwana Series
Parametry opcjonalne
- jak : {'left', 'right', 'external', 'inner'} default 'inner'
- on : etykieta lub lista
- left_on : etykieta lub lista lub podobne do tablicy
- right_on : etykieta lub lista lub podobne do tablicy
- left_index : bool, domyślnie False
- right_index : bool, domyślnie False
- sort : bool, default False
- przyrostki : krotka z (str, str), domyślne ('_x', '_y')
- copy : bool, domyślnie True
- wskaźnik : bool lub str, domyślnie False
- validate : str, opcjonalne
Ważne: pd.DataFrame.merge
wymaga prawa do bycia pd.DataFrame
lub nazwanym pd.Series
obiektem.
Wynik
Ponadto, jeśli sprawdzimy, jak poniżej znajduje się dokumentacja operacji scalania na pandach:
Wykonaj operację scalania bazy danych (SQL) między dwoma obiektami DataFrame lub Series, używając kolumn jako kluczy lub ich indeksów wierszy
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
- objs : sekwencja lub mapowanie obiektów Series lub DataFrame
Parametry opcjonalne
- oś : {0 / 'indeks', 1 / 'kolumny'}, domyślnie 0
- join : {'inner', 'external'}, domyślnie 'external'
- ignore_index : bool, default False
- klucze : sekwencja, domyślnie Brak
- poziomy : lista sekwencji, wartość domyślna Brak
- nazwy : lista, domyślnie Brak
- verify_integrity : bool, default False
- sort : bool, default False
- copy : bool, domyślnie True
Wynik
- Zwraca : obiekt, typ obiektów
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])
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;
.merge()
i.join()
.