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