Основна відмінність між злиттям і конкатом полягає в тому, що злиття дозволяє виконувати більш структуроване "об'єднання" таблиць, де використання конката ширше і менш структуровано.
Злиття
Посилаючись на документацію , pd.DataFrame.merge
приймає право як необхідний аргумент, що можна вважати об’єднанням лівої таблиці та правої таблиці згідно з деякою заздалегідь визначеною структурованою операцією об’єднання. Зверніть увагу на визначення правого параметра .
Обов’язкові параметри
- праворуч : DataFrame або названа серія
Необов’язкові параметри
- як : {'лівий', 'правий', 'зовнішній', 'внутрішній'} за замовчуванням 'внутрішній'
- на : ярлик або список
- left_on : мітка або список або схожий на масив
- right_on : мітка або список або схожий на масив
- left_index : bool, за замовчуванням False
- right_index : bool, за замовчуванням False
- сортувати : bool, за замовчуванням False
- суфікси : кортеж (str, str), за замовчуванням ('_x', '_y')
- copy : bool, за замовчуванням True
- індикатор : bool або str, за замовчуванням False
- перевірити : str, необов’язково
Важливо: pd.DataFrame.merge
вимагає права бути об’єктом pd.DataFrame
або іменованим pd.Series
.
Вихідні дані
Крім того, якщо ми перевіримо документацію для операції злиття на пандах:
Виконайте операцію злиття бази даних (SQL) між двома об'єктами DataFrame або Series, використовуючи або стовпці як ключі, або їх індекси рядків
Конкат
Зверніться до документації по pd.concat
, першої нота , що параметр не названий будь-який з таблиці, data_frame, серії, матриця і т.д., але Objs замість цього. Тобто ви можете передати багато "контейнерів даних", які визначаються як:
Iterable[FrameOrSeriesUnion], Mapping[Optional[Hashable], FrameOrSeriesUnion]
Обов’язкові параметри
- objs : послідовність або відображення об’єктів Series або DataFrame
Необов’язкові параметри
- вісь : {0 / 'індекс', 1 / 'стовпці'}, за замовчуванням 0
- join : {'внутрішній', 'зовнішній'}, за замовчуванням 'зовнішній'
- ignore_index : bool, за замовчуванням False
- клавіші : послідовність, за замовчуванням Немає
- рівні : список послідовностей, за замовчуванням Немає
- імена : список, за замовчуванням Немає
- verify_integrity : bool, за замовчуванням False
- сортувати : bool, за замовчуванням False
- copy : bool, за замовчуванням True
Вихідні дані
- Повертає : об'єкт, тип objs
Приклад
Код
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)
Вивід коду
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
Однак ви можете досягти першого виводу (злиття) з concat, змінивши параметр осі
concat_result = pd.concat([df_left, df_right], sort=False, axis=1)
Дотримуйтесь наступної поведінки,
concat_result = pd.concat([df_left, df_right, df_left, df_right], sort=False)
виходи;
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
, яку ви не можете виконати подібну операцію зі злиттям, оскільки вона дозволяє лише один DataFrame або названу серію.
merge_result = df_left.merge([df_right, df_left, df_right], left_index=True, right_index=True)
виходи;
TypeError: Can only merge Series or DataFrame objects, a <class 'list'> was passed
Висновок
Як ви вже помічали, вхідні та вихідні дані можуть відрізнятися між "злиттям" та "конкатом".
Як я вже згадував на початку, найперша (основна) відмінність полягає в тому, що "злиття" виконує більш структуроване об'єднання з набором обмеженого набору об'єктів і параметрів, де як "concat" виконує менш жорстке / ширше об'єднання з ширшим набором об'єктів і параметрів.
Загалом, злиття менш толерантне до змін / (введення), а «concat» - більш вільне / менш чутливе до змін / (введення). Ви можете досягти "злиття", використовуючи "concat", але зворотне не завжди справедливо.
Операція "Злиття" використовує стовпці фреймів даних (або ім'я pd.Series
об'єкта) або індекси рядків, і оскільки вона використовує лише ці сутності, вона виконує горизонтальне об'єднання кадрів даних або рядів, і в результаті не застосовує вертикальну операцію.
Якщо ви хочете побачити більше, ви можете трохи поринути у вихідний код;
.merge()
та.join()
.