pd.DataFrame.merge()
和pd.concat()
的本质区别是什么?
到目前为止,这是我发现的,请评论我的理解有多完整和准确:
.merge()
只能使用列(加上行索引),它在语义上适合数据库风格的操作。.concat()
可以与任何一个轴一起使用,只使用索引,并提供添加分层索引的选项。- 顺便说一句,这允许以下冗余:两者都可以使用行索引来合并组合两个嵌套帧。
pd.DataFrame.join()
仅仅提供了.merge()
用例子集的简写。
(Pandas非常擅长解决数据分析中的各种用例。研究文档以找出执行特定任务的最佳方式可能有点令人生畏。)
8条答案
按热度按时间g6ll5ycj1#
一个非常高的级别差异是,
merge()
用于根据公共列的值(也可以使用索引,使用left_index=True
和/或right_index=True
)来合并组合两个(或多个)嵌套框,而concat()
用于将一个(或多个)嵌套框一个接一个地附加在另一个下面(或横向,取决于axis
选项设置为0还是1)。join()
用于根据索引合并2个字符串;我们可以使用join()
来代替merge()
和left_index=True
选项。举例来说:
字符串
lp0sw83n2#
在高级别:
.concat()
只是将多个DataFrame
垂直堆叠在一起,或在索引上对齐后水平缝合.merge()
首先对齐两个DataFrame
选定的公共列或索引,然后从每个DataFrame
的对齐行中拾取剩余的列。更具体地说,
.concat()
:DataFrame
垂直或水平组合DataFrame
包含重复索引时出错。.merge()
:DataFrame
方法(从pandas 1.0开始)DataFrame
DataFrame
的列或索引与其他DataFrame
的列或索引对齐请注意,在执行
pd.merge(left, right)
时,如果left
有两行包含来自连接列或索引的相同值,则每行将与right
的相应行合并组合,从而产生carryover乘积。另一方面,如果.concat()
用于合并组合列,则需要确保DataFrame
中不存在重复的索引。实际上:
DataFrame
时,首先考虑.concat()
,而当组合互补DataFrame
时,首先考虑.merge()
。.concat()
。如果需要通过列合并,使用.merge()
,默认情况下合并公共列。参考:Pandas 1.x Cookbook
hyrbngr73#
pd.concat
将Iterable
作为其参数。因此,它不能直接将DataFrame
s作为其参数。此外,DataFrame
的Dimension
s在连接时应沿沿着轴匹配。pd.merge
可以将DataFrame
s作为其参数,并用于合并将两个具有相同列或索引的DataFrame
s合并,这在pd.concat
中无法完成,因为它将在DataFrame中显示重复的列。而join可以用来连接两个索引不同的
DataFrame
。xxhby3vn4#
我目前正在尝试理解
pd.DataFrame.merge()
和pd.concat()
之间的本质区别。好问题。主要区别:
pd.concat
在两个轴上都工作。另一个区别是,
pd.concat
只有 innerdefault和 outer joins,而pd.DataFrame.merge()
有 * left*,right,outer,inner defaultjoins。第三个值得注意的区别是:
pd.DataFrame.merge()
在合并同名列时可以选择设置列后缀,而pd.concat
则不可以。使用
pd.concat
默认情况下,您可以堆叠多个嵌套帧(axis=0
)的行,当您设置axis=1
时,您可以模拟pd.DataFrame.merge()
功能。pd.concat
的一些有用的例子:字符串
pxq42qpu5#
merge和concat之间的主要区别是merge允许你在concat的使用更广泛和更少结构化的情况下执行更结构化的表“联接”。
合并
参考documentation,
pd.DataFrame.merge
将 right 作为必需参数,您可以将其视为根据某些预定义的结构化连接操作连接左表和右表。请注意参数 right 的定义。重要提示:
pd.DataFrame.merge
需要权限才能成为pd.DataFrame
或命名pd.Series
对象。输出
此外,如果我们检查pandas上的合并操作的文档字符串,则如下所示:
在两个DataFrame或Series对象之间执行数据库(SQL)合并操作,将列用作键或使用其行索引
Concat
参考
pd.concat
的documentation,首先注意参数的命名不是 table、data_frame、series、matrix 等中的任何一个,而是 objs。也就是说,可以传递很多“数据容器”,定义为:Iterable[FrameOrSeriesUnion], Mapping[Optional[Hashable], FrameOrSeriesUnion]
个必填参数
示例
字符串
型
但是,您可以通过更改 axis 参数来实现concat的第一个输出(合并
型
观察以下行为,
型
产出;
型
,您不能对merge执行类似的操作,因为它只允许单个DataFrame或命名Series。
型
产出;
型
结论
你可能已经注意到了,“merge”和“concat”之间的输入和输出可能不同。
**正如我在开始时提到的,第一个(主要)区别是“merge”执行一个更结构化的连接,带有一组受限的对象和参数,而“concat”执行一个不太严格/更广泛的连接,带有一组更广泛的对象和参数。
总而言之,merge对更改/(输入)的容忍度较低,而“concat”对更改/(输入)的敏感度较低。* 您可以使用“concat”实现“merge”,但反过来并不总是正确的。*
“合并”操作使用 Dataframe 列(或
pd.Series
对象的名称)或行索引,由于它只使用这些实体,因此它执行 Dataframe 或系列的水平合并,而不应用垂直操作。如果你想了解更多,你可以深入研究一下源代码;
vbopmzt16#
concat
方法与SQL
中的UNION ALL
操作符完全相同。(如SQL
),但也可沿列轴沿着(如果你concat两个每个3列的嵌套,你会得到一个6列的新嵌套)。join
和merge
方法与SQL
中的JOIN
相同,尽管后者更强大并且是最常用的。bejyjqdl7#
只有concat函数有axis参数。Merge用于根据共享列中的值并排合并合并多个框架,因此不需要axis参数。
klsxnrf18#
默认情况下:
join是按列左联接
merge是一个按列的内部连接
concat是一个按行的外部连接
pd.concat:
接受Iterable参数。因此,它不能直接接受DataFrames(使用[df,df2])
DataFrame的尺寸应沿沿着轴匹配
Join和pd.merge:
可以接受DataFrame参数
Click to see picture for understanding why code below does the same thing
字符串