Разница между слиянием() и concat() в pandas
Какая существенная разница (и) между pd.DataFrame.merge()
и pd.concat()
?
Пока это то, что я нашел, пожалуйста, прокомментируйте, насколько полно и точно мое понимание:
.merge()
может использовать только столбцы (плюс индексы строк), и это семантически подходит для операций в стиле базы данных. .concat()
может использоваться с любой осью, используя только индексы, и дает возможность добавить иерархический индекс.
Кстати, это допускает следующую избыточность: оба могут объединять два кадра данных, используя индексы строк.
pd.DataFrame.join()
просто предлагает сокращение для подмножества вариантов использования .merge()
(Pandas отлично справляется с очень широким спектром вариантов использования при анализе данных. Может быть немного утомительно изучать документацию, чтобы выяснить, как лучше всего выполнить определенную задачу.)
Ответы
Ответ 1
Очень высокая разность уровней заключается в том, что merge()
используется для объединения двух (или более) DataFrames на основе значений общих столбцов (также можно использовать индексы, используйте 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
Ответ 2
pd.concat
качестве аргумента pd.concat
принимает Iterable
. Следовательно, он не DataFrame
напрямую принимать DataFrame
качестве аргумента. Кроме того, Dimension
DataFrame
должен совпадать вдоль оси при конкатенации.
pd.merge
может принимать DataFrame
качестве своего аргумента и используется для объединения двух DataFrame
с одинаковыми столбцами или индексом, что невозможно сделать с помощью pd.concat
поскольку он отображает повторяющийся столбец в DataFrame.
В то время как объединение может использоваться для объединения двух DataFrame
с разными индексами.
Ответ 3
В настоящее время я пытаюсь понять существенные различия между pd.DataFrame.merge()
и pd.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
Ответ 4
по умолчанию:
объединение - это объединение слева по столбцу
pd.merge - inner join по столбцам
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)