Pandas非常擅长处理数据分析中的各种用例。探索文档以确定执行特定任务的最佳方式可能有点令人生畏。
我目前正在尝试了解pd.DataFrame.merge()
和pd.concat()
之间的本质区别。到目前为止,这是我能说清楚的:
.merge()
只能使用列(加上行索引),它在语义上适用于数据库样式的操作。 .concat()
可以与任一轴一起使用,仅使用索引,并提供添加分层索引的选项。
顺便提一下,这允许以下冗余:两者都可以使用行索引组合两个数据帧。
至于pd.DataFrame.join()
,它似乎只是提供了.merge()
用例子集的简写。
有人可以评论我此时的理解是否完整和准确吗?
谢谢。
答案 0 :(得分:41)
非常高级别的差异是#!/bin/bash
#SBATCH -A XXXXXXX
#SBATCH -J testRun
#SBTACH -o output/testOutput
#SBATCH -n 1
#SBATCH -p projectName
#SBATCH -t 00:01:00
ibrun ./test
用于根据公共列的值组合两个(或更多)数据帧(也可以使用索引,使用merge()
和/或{ {1}}),left_index=True
用于将一个(或多个)数据框一个接一个地追加(或横向,取决于right_index=True
选项是否设置为0或1)。
concat()
用于根据索引合并2个数据帧;我们可以使用axis
。
join()
与merge()
选项一起使用
例如:
left_index=True
答案 1 :(得分:9)
pd.concat
以Iterable
为参数。因此,它不能直接将DataFrame
作为其参数。 Dimension
的{{1}}也应该在连接时沿轴匹配。
DataFrame
可以将pd.merge
作为其参数,并用于将两个DataFrame
与相同的列或索引合并,而DataFrame
无法完成因为它会在DataFrame中显示重复的列。
而join可用于连接具有不同索引的两个pd.concat
。
答案 2 :(得分:5)
高层次:
.concat()
只需将多个DataFrame
堆叠在一起
垂直或在对齐索引后水平缝制.merge()
首先对齐两个DataFrame
'选定的公共列,或者
索引,然后从每个DataFrame
的对齐行中选取其余的列。更具体地说,.concat()
:
DataFrame
垂直或水平DataFrame
中的任何一个包含重复索引时出错。还有.merge()
:
DataFrame
方法存在(自熊猫1.0起)DataFrame
组合在一起DataFrame
的列或索引与其他列对齐
DataFrame
的列或索引请注意,执行pd.merge(left, right)
时,如果left
有两行包含来自连接列或索引的相同值,则每一行将与right
的对应行合并产生笛卡尔积。另一方面,如果使用.concat()
合并列,则需要确保在DataFrame
中没有重复的索引。
实际上是:
.concat()
时首先考虑DataFrame
,而
结合互补的.merge()
时,请先考虑DataFrame
。.concat()
。如果需要合并
通过列在水平方向上与.merge()
一起使用,默认情况下clear
合并在列上。答案 3 :(得分:2)
merge&concat之间的主要区别在于,merge使您可以对concat的使用范围更广且结构化程度更低的表执行结构化的“联接”。
合并
引用documentation,pd.DataFrame.merge
将 right 作为必需参数,您可以将其视为根据一些预定义的结构化联接来联接left表和right表操作。请注意参数 right 的定义。
必需参数
可选参数
重要提示::pd.DataFrame.merge
要求权限是pd.DataFrame
或命名为pd.Series
的对象。
输出
此外,如果我们在下面检查熊猫的合并操作的文档字符串,则如下:
在两个DataFrame或Series之间执行数据库(SQL)合并操作 使用列作为键或它们的行索引的对象
Concat
请参阅pd.concat
中的documentation,首先请注意,该参数未命名为 table,data_frame,series,matrix 等中的任何一个,而是命名为 objs 。也就是说,您可以传递许多“数据容器”,它们定义为:
Iterable[FrameOrSeriesUnion], Mapping[Optional[Hashable], FrameOrSeriesUnion]
必需参数
可选参数
输出
示例
代码
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或命名为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
对象的名称)或行索引,并且由于仅使用这些实体,因此它执行数据框或系列的水平合并,并且不将垂直操作应用于结果。
如果您想了解更多,可以稍微深入一下源代码;
答案 4 :(得分:0)
我目前正在尝试了解
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
答案 5 :(得分:0)
只有concat函数具有轴参数。合并用于根据共享列中的值并排合并数据帧,因此不需要轴参数。
答案 6 :(得分:-1)
默认情况下:
join是列式左连接
pd.merge是按列的内部联接
pd.concat是按行的外部联接
pd.concat:
带有Iterable参数。因此,它不能直接采用DataFrames(使用[df,df2])
DataFrame的尺寸应沿轴
加入并合并:
可以接受DataFrame参数
Click to see picture for understanding why code below does the same thing
df1.join(df2)
pd.merge(df1,df2,left_index = True,right_index = True)
pd.concat([df1,df2],轴= 1)