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
示例完全一样。