主要区别在于merge和concat之间的区别是,merge允许您执行更结构化的表“join”,而使用concat更广泛且不太结构化。
合并
参考
文档,pd.DataFrame.merge将right作为必需参数,您可以将其视为根据某些预定义的结构化连接操作连接左表和右表。请注意参数right的定义。
必需参数
right:DataFrame或命名Series
可选参数
- how: {‘left’, ‘right’, ‘outer’, ‘inner’},默认为‘inner’
- on: 标签或列表
- left_on: 标签或列表,或类似数组
- right_on: 标签或列表,或类似数组
- left_index: 布尔值,默认为False
- right_index: 布尔值,默认为False
- sort: 布尔值,默认为False
- suffixes: 元组(str, str),默认为(‘_x’, ‘_y’)
- copy: 布尔值,默认为True
- indicator: 布尔值或字符串,默认为False
- validate: 字符串,可选
重要提示: pd.DataFrame.merge
要求右侧为pd.DataFrame
或命名为pd.Series
对象。
输出
此外,如果我们查看 pandas 的 Merge Operation 的文档字符串如下:
使用列或行索引作为键,在两个DataFrame或Series对象之间执行数据库(SQL)合并操作。
Concat
请参考
文档中的
pd.concat
,首先注意参数没有命名为
table,data_frame,series,matrix等,而是命名为
objs。也就是说,您可以传递许多“数据容器”,这些容器定义为:
Iterable[FrameOrSeriesUnion],Mapping[Optional[Hashable],FrameOrSeriesUnion]
必需参数
objs:序列或映射的Series或DataFrame对象
可选参数
- axis: {0/’index’, 1/’columns’},默认为0
- join: {‘inner’, ‘outer’},默认为‘outer’
- ignore_index: 布尔类型,默认为False
- keys: 序列,默认为None
- levels: 序列列表,默认为None
- names: 列表,默认为None
- verify_integrity: 布尔类型,默认为False
- sort: 布尔类型,默认为False
- copy: 布尔类型,默认为True
输出
例子
代码
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
你可以通过更改
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
使用merge无法执行类似的操作,因为它只允许单个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
结论
您可能已经注意到,“merge”和“concat”之间的输入和输出可能不同。
正如我在开始时提到的,第一个(主要)区别是,“merge”使用一组受限制的对象和参数执行更结构化的联接操作,而“concat”使用更宽泛的一组对象和参数执行较不严格/更广泛的联接操作。
总的来说,“merge”对变化/输入的容忍度较低,“concat”则对变化/输入的敏感度较低。 通过使用“concat”,可以实现“merge”,但反之则不一定成立。
“Merge”操作使用数据框列(或pd.Series
对象的名称)或行索引,因为它仅使用这些实体,所以它执行数据框或系列的水平合并,并且不应用垂直操作。
如果您想了解更多信息,可以深入查看源代码;
.merge()
和.join()
的讨论。 - WindChimes