merge&concat之间的主要区别在于,merge使您可以在concat的使用范围更广且结构化程度更低的表上执行结构化的“联接”。
合并
引用文档,pd.DataFrame.merge
将right作为必需的参数,您可以将其视为根据一些预定义的结构化联接操作联接左表和右表。注意参数right的定义。
必要参数
可选参数
- 方式:{'左','右','外','内'}默认'内'
- 上:标签或列表
- left_on:标签或列表,或类似数组
- right_on:标签或列表,或类似数组
- left_index:布尔值,默认为False
- right_index:布尔值,默认为False
- 排序:布尔值,默认为False
- 后缀:(str,str)的元组,默认('_x','_y')
- 复制:bool,默认为True
- 指标:bool或str,默认为False
- validate:str,可选
重要提示: pd.DataFrame.merge
要求权限是一个pd.DataFrame
或命名pd.Series
对象。
输出量
此外,如果我们在下面检查熊猫的合并操作的文档字符串,请执行以下操作:
使用列作为键或它们的行索引在两个DataFrame或Series对象之间执行数据库(SQL)合并操作
康卡特
请参阅文件中pd.concat
,首先要注意的参数中指定的任何的表,data_frame,系列,矩阵等,但OBJ文件来代替。也就是说,您可以传递许多“数据容器”,它们定义为:
Iterable[FrameOrSeriesUnion], Mapping[Optional[Hashable], FrameOrSeriesUnion]
必要参数
- objs:Series或DataFrame对象的序列或映射
可选参数
- 轴:{0 /'索引',1 /'列'},默认0
- join:{'inner','outer'},默认为'outer'
- ignore_index:布尔值,默认为False
- 键:序列,默认无
- 级别:序列列表,默认为无
- 名称:列表,默认无
- verify_integrity:bool,默认为False
- 排序:布尔值,默认为False
- 复制:bool,默认为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
,您无法通过合并执行类似的操作,因为它仅允许单个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
对象的名称)或行索引,并且由于仅使用这些实体,因此它执行数据框或系列的水平合并,因此不应用垂直操作。
如果您想了解更多,可以稍微深入一下源代码。
.merge()
和的讨论.join()
。