merge 和 concat 之间的主要区别在于,merge 允许您对表执行更结构化的“连接”,其中 concat 的使用范围更广,结构更少。
合并
引用documentation,pd.DataFrame.merge将right作为必填参数,你可以认为它是根据一些预定义的结构化连接操作来连接左表和右表。注意参数right的定义。
必需参数
可选参数
-
如何:{‘left’, ‘right’, ‘outer’, ‘inner’} 默认‘inner’
-
on:标签或列表
-
left_on:标签或列表,或类似数组
-
right_on:标签或列表,或类数组
-
left_index: bool,默认为 False
-
right_index: bool,默认为 False
-
排序:bool,默认为False
-
后缀:元组 (str, str),默认 (‘_x’, ‘_y’)
-
复制:bool,默认为真
-
指标:bool或str,默认False
-
验证:str,可选
重要提示: pd.DataFrame.merge 要求权限为 pd.DataFrame 或命名为 pd.Series 对象。
输出
此外,如果我们检查一下关于 Pandas 的 Merge Operation 的文档字符串如下:
在两个 DataFrame 或 Series 之间执行数据库 (SQL) 合并操作
使用列作为键或其行索引的对象
连接
参考pd.concat的documentation,首先注意参数不是table、data_frame、series、matrix等中的任何一个,而是objs反而。也就是可以传递很多“数据容器”,定义为:
Iterable[FrameOrSeriesUnion], Mapping[Optional[Hashable], FrameOrSeriesUnion]
必需参数
-
objs:Series 或 DataFrame 对象的序列或映射
可选参数
-
轴:{0/'index', 1/'columns'},默认 0
-
加入:{‘inner’, ‘outer’},默认‘outer’
-
ignore_index: bool,默认为 False
-
keys:序列,默认无
-
levels:序列列表,默认无
-
名称:列表,默认无
-
verify_integrity: bool,默认为 False
-
排序:bool,默认为False
-
复制:bool,默认为真
输出
示例
代码
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
但是,您可以通过更改 axis 参数来使用 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
结论
您可能已经注意到,“merge”和“concat”之间的输入和输出可能不同。
正如我在开头提到的,第一个(主要)区别是“合并”执行更结构化的连接,其中包含一组受限制的对象和参数,而“concat”执行不那么严格/更广泛的连接与更广泛的对象和参数集。
总而言之,merge 对更改/(输入)的容忍度较低,而“concat”对更改/(输入)更宽松/不太敏感。 你可以通过使用“concat”来实现“merge”,但反过来并不总是如此。
“合并”操作使用数据框列(或 pd.Series 对象的名称)或行索引,由于它仅使用这些实体,因此它执行数据框或系列的水平合并,因此不应用垂直操作.
如果你想看更多,你可以深入研究一下源代码;