В чем существенное различие между pd.DataFrame.merge()
и pd.concat()
?
Пока что это то, что я обнаружил, прокомментируйте, пожалуйста, насколько полно и точно я понимаю:
.merge()
может использовать только столбцы (плюс индексы строк) и семантически подходит для операций в стиле базы данных..concat()
может использоваться с любой осью, используя только индексы, и дает возможность добавления иерархического индекса.Между прочим, это обеспечивает следующую избыточность: оба могут объединять два фрейма данных, используя индексы строк.
pd.DataFrame.join()
просто предлагает сокращение для подмножества вариантов использования.merge()
(Pandas отлично подходит для решения очень широкого спектра сценариев использования в анализе данных. Может быть немного сложно изучить документацию, чтобы выяснить, как лучше всего выполнить конкретную задачу.)
.merge()
и.join()
.Ответы:
Разница очень высокого уровня заключается в том, что
merge()
используется для объединения двух (или более) фреймов данных на основе значений общих столбцов (индексы также могут использоваться, использоватьleft_index=True
и / илиright_index=True
) иconcat()
используется для добавления одного (или нескольких) фреймов данных в один ниже другого (или сбоку, в зависимости от того, установлен лиaxis
параметр на 0 или 1).join()
используется для объединения 2 фреймов данных на основе индекса; вместо использованияmerge()
с опцией, которуюleft_index=True
мы можем использоватьjoin()
.Например:
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
источник
how
вmerge
действии и означает совершенно иное, чем то, в чем он заключаетсяconcat
?pd.concat
принимает вIterable
качестве аргумента. Следовательно, он не можетDataFrame
напрямую принимать s в качестве аргумента. ТакжеDimension
s изDataFrame
должны совпадать по оси при конкатенации.pd.merge
может приниматьDataFrame
s в качестве аргумента и используется для объединения двухDataFrame
s с одинаковыми столбцами или индексом, что невозможно сделать,pd.concat
поскольку он будет отображать повторяющийся столбец в DataFrame.В то время как join можно использовать для объединения двух
DataFrame
s с разными индексами.источник
concat
это не что иное, как приклеивание нескольких фреймов данных поверх / рядом друг с другом. Он не осведомлен о содержании в том смысле, что он просто покажет один и тот же столбец дважды. В то время какmerge
фактически объединяет столбцы, когда они одинаковы.concat
где размеры не совпадают.Хороший вопрос. Главное отличие:
pd.concat
работает по обеим осям.Другое отличие состоит в том, что у
pd.concat
него есть только внутренние соединения по умолчанию и только внешние соединения, тогда какpd.DataFrame.merge()
есть левые , правые , внешние и внутренние соединения по умолчанию .Третье заметное другое отличие:
pd.DataFrame.merge()
есть возможность устанавливать суффиксы столбцов при объединении столбцов с одинаковыми именами, в то время какpd.concat
это невозможно.По
pd.concat
умолчанию вы можете складывать строки из нескольких фреймов данных (axis=0
), а когда вы устанавливаете,axis=1
вы имитируетеpd.DataFrame.merge()
функцию.Несколько полезных примеров
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
источник
На высоком уровне:
.concat()
просто складывает несколькоDataFrame
вместе либо по вертикали, либо по горизонтали после выравнивания по индексу.merge()
сначала выравнивает дваDataFrame
выбранных общих столбца (столбцов) или индекса, а затем выбирает оставшиеся столбцы из выровненных строк каждогоDataFrame
.Более конкретно
.concat()
:DataFrame
вертикали или горизонталиDataFrame
содержит повторяющийся индекс.И
.merge()
:DataFrame
метод (начиная с pandas 1.0)DataFrame
горизонталиDataFrame
столбец (столбцы) или индекс вызывающего абонента с другимDataFrame
столбцом (столбцами) или индексомОбратите внимание, что при выполнении
pd.merge(left, right)
, еслиleft
есть две строки, содержащие одинаковые значения из соединяемых столбцов или индекса, каждая строка будет объединяться сright
соответствующей строкой (строками), в результате чего получается декартово произведение. С другой стороны, если.concat()
он используется для объединения столбцов, нам нужно убедиться, что ни в одном из них нет повторяющегося индексаDataFrame
.Практически:
.concat()
первую очередь при объединении однородныхDataFrame
, а в.merge()
первую очередь - при объединении дополнительныхDataFrame
..concat()
. Если необходимо объединить столбцы по горизонтали, выберите вариант,.merge()
который по умолчанию объединяет общие столбцы.Ссылка: Pandas 1.x Cookbook
источник
Основное различие между объединением и объединением состоит в том, что объединение позволяет выполнять более структурированное «объединение» таблиц, где использование объединения более широко и менее структурировано.
Объединить
Ссылаясь на документацию ,
pd.DataFrame.merge
принимает right как обязательный аргумент, который вы можете рассматривать как объединение левой таблицы и правой таблицы в соответствии с некоторой предопределенной операцией структурированного соединения. Обратите внимание на определение параметра right .Обязательные параметры
Дополнительные параметры
Важно:
pd.DataFrame.merge
требуется право быть объектомpd.DataFrame
или именованнымpd.Series
объектом.Вывод
Кроме того, если мы проверим строку документации для операции слияния на пандах, она будет ниже:
Concat
Обратитесь к документации по
pd.concat
, первой нота , что параметр не назван любой из таблицы, data_frame, серии, матрица и т.д., но Objs вместо этого. То есть вы можете передать множество «контейнеров данных», которые определены как:Iterable[FrameOrSeriesUnion], Mapping[Optional[Hashable], FrameOrSeriesUnion]
Обязательные параметры
Дополнительные параметры
Вывод
пример
Код
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)
Вывод кода
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 или именованный Series.
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
объекта) или индексы строк, и, поскольку он использует только эти сущности, выполняет горизонтальное слияние фреймов данных или серий и не применяет вертикальную операцию в результате.Если вы хотите увидеть больше, вы можете немного погрузиться в исходный код;
источник
Только функция concat имеет параметр оси. Слияние используется для объединения фреймов данных бок о бок на основе значений в общих столбцах, поэтому параметр оси не требуется.
источник
по умолчанию:
join - это левое соединение по
столбцам pd.merge - это внутреннее соединение по
столбцам pd.concat - внешнее соединение по строкам
pd.concat:
принимает итерируемые аргументы. Таким образом, он не может принимать DataFrames напрямую (используйте [df, df2]).
Размеры DataFrame должны совпадать по оси
Присоединиться и pd.merge:
может принимать аргументы DataFrame
Нажмите, чтобы увидеть изображение, чтобы понять, почему приведенный ниже код делает то же самое.
df1.join(df2) pd.merge(df1, df2, left_index=True, right_index=True) pd.concat([df1, df2], axis=1)
источник