join 和 merge 之间有什么区别

考虑数据帧 leftright

left = pd.DataFrame([['a', 1], ['b', 2]], list('XY'), list('AB'))
left

   A  B
X  a  1
Y  b  2
right = pd.DataFrame([['a', 3], ['b', 4]], list('XY'), list('AC'))
right

   A  C
X  a  3
Y  b  4

join
认为 join 希望根据各自的索引合并到数据帧。如果存在重叠列,则 join 会要求你在左侧数据框中为重叠列名称添加后缀。我们的两个数据框确实有一个重叠的列名称 A

left.join(right, lsuffix='_')

  A_  B  A  C
X  a  1  a  3
Y  b  2  b  4

请注意,索引已保留,我们有 4 列。left 有 2 列,right 有 2 列。

如果索引没有对齐

left.join(right.reset_index(), lsuffix='_', how='outer')

    A_    B index    A    C
0  NaN  NaN     X    a  3.0
1  NaN  NaN     Y    b  4.0
X    a  1.0   NaN  NaN  NaN
Y    b  2.0   NaN  NaN  NaN

我使用外连接来更好地说明这一点。如果索引不对齐,则结果将是索引的并集。

我们可以告诉 join 使用左侧数据帧中的特定列作为连接键,但它仍将使用右侧的索引。

left.reset_index().join(right, on='index', lsuffix='_')

  index A_  B  A  C
0     X  a  1  a  3
1     Y  b  2  b  4

merge
merge 视为对齐列。默认情况下,merge 将查找要合并的重叠列。merge 允许用户指定要与参数 on 一起使用的重叠列的子集,或者单独允许指定左侧的哪些列以及右侧的哪些列进行合并,从而更好地控制合并键。

merge 将返回一个合并的数据帧,其中索引将被销毁。

这个简单的例子发现重叠列是'A'并基于它组合。

left.merge(right)

   A  B  C
0  a  1  3
1  b  2  4

注意索引是 [0, 1] 而不再是 ['X', 'Y']

你可以使用 left_indexright_index 参数明确指定要合并索引

left.merge(right, left_index=True, right_index=True, suffixes=['_', ''])

  A_  B  A  C
X  a  1  a  3
Y  b  2  b  4

这看起来与上面的 join 示例完全一样。