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