join 和 merge 之间有什么区别
考虑数据帧 left 和 right
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_index 或 right_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 示例完全一样。