Misalkan saya memiliki dua DataFrames seperti itu:
left = pd.DataFrame({'key1': ['foo', 'bar'], 'lval': [1, 2]})
right = pd.DataFrame({'key2': ['foo', 'bar'], 'rval': [4, 5]})
Saya ingin menggabungkan mereka, jadi saya mencoba sesuatu seperti ini:
pd.merge(left, right, left_on='key1', right_on='key2')
Dan saya senang
key1 lval key2 rval
0 foo 1 foo 4
1 bar 2 bar 5
Tapi saya mencoba menggunakan metode join, yang saya percaya sangat mirip.
left.join(right, on=['key1', 'key2'])
Dan saya mendapatkan ini:
//anaconda/lib/python2.7/site-packages/pandas/tools/merge.pyc in _validate_specification(self)
406 if self.right_index:
407 if not ((len(self.left_on) == self.right.index.nlevels)):
--> 408 raise AssertionError()
409 self.right_on = [None] * n
410 elif self.right_on is not None:
AssertionError:
Apa yang saya lewatkan?
merge
bergabung dengan kolomleft
ke kolomright
, yang adalah apa yang Anda inginkan, tetapijoin(... on=[...])
bergabung dengan kolomleft
untuk kunci indeksright
, yang bukan yang Anda inginkan. Lihat jawaban saya di bawah ini untuk lebih jelasnya.on
opsi) terhadapother
indeks. Ingat, indeks untuk bergabung. Sedangkan merge () adalah metode yang lebih umum.Jawaban:
Saya selalu menggunakan
join
indeks:Fungsionalitas yang sama dapat diperoleh dengan menggunakan
merge
pada kolom berikut:sumber
right
kedalaman yang sama dengan panjang padaon
. Bagi saya itu masuk akal. Saya dapat menerima bahwa semantiknya berbeda. Tapi saya ingin tahu apakah saya bisa mendapatkan perilaku yang sama dengan df.joinpandas.merge()
adalah fungsi dasar yang digunakan untuk semua perilaku gabungan / gabung.DataFrames menyediakan
pandas.DataFrame.merge()
danpandas.DataFrame.join()
metode sebagai cara mudah untuk mengakses kemampuanpandas.merge()
. Misalnya,df1.merge(right=df2, ...)
setara denganpandas.merge(left=df1, right=df2, ...)
.Ini adalah perbedaan utama antara
df.join()
dandf.merge()
:df1.join(df2)
selalu bergabung melalui indeksdf2
, tetapidf1.merge(df2)
dapat bergabung ke satu atau beberapa kolomdf2
(default) atau ke indeksdf2
(denganright_index=True
).df1.join(df2)
menggunakan indeksdf1
dandf1.merge(df2)
menggunakan kolomdf1
. Itu dapat diganti dengan menentukandf1.join(df2, on=key_or_keys)
ataudf1.merge(df2, left_index=True)
.df1.join(df2)
apakah gabungan kiri secara default (membuat semua barisdf1
), tetapidf.merge
apakah gabungan internal secara default (hanya mengembalikan baris yang cocok dengandf1
dandf2
).Jadi, pendekatan generik adalah menggunakan
pandas.merge(df1, df2)
ataudf1.merge(df2)
. Tetapi untuk sejumlah situasi umum (menjaga semua barisdf1
dan bergabung dengan indeksdf2
), Anda dapat menyimpan beberapa pengetikan dengan menggunakandf1.join(df2)
sebagai gantinya.Beberapa catatan tentang masalah ini dari dokumentasi di http://pandas.pydata.org/pandas-docs/stable/merging.html#database-style-dataframe-joining-merging :
...
sumber
on=key_or_keys
untuk mengubah cara baris ditemukan di tabel kanan. Namun, sebenarnya bukan itu masalahnya. Theon
argumen mengubah lookup di sebelah kiri meja (df1
) dari indeks ke kolom (s). Namun, bahkan dengan argumen ini, tabel kanan (df2
) akan dicocokkan melalui indeksnya. (Lihat contoh terakhir di atas.)Saya percaya itu
join()
hanya metode kenyamanan. Cobadf1.merge(df2)
saja, yang memungkinkan Anda menentukanleft_on
danright_on
:sumber
Dari dokumentasi ini
Dan:
sumber
Salah satu perbedaannya adalah
merge
membuat indeks baru, danjoin
menjaga indeks sisi kiri. Ini dapat memiliki konsekuensi besar pada transformasi Anda nanti jika Anda salah berasumsi bahwa indeks Anda tidak berubahmerge
.Sebagai contoh:
-
-
-
sumber
on
parameter memiliki arti berbeda dalam kedua kasussumber
Untuk menaruhnya secara analog ke SQL "Gabungan panda adalah untuk bagian luar / bagian dalam dan panda bergabung adalah bagian dari gabungan alami". Karenanya saat Anda menggunakan penggabungan dalam panda, Anda ingin menentukan jenis bahasa gabung mana yang ingin Anda gunakan sedangkan ketika Anda menggunakan panda bergabung, Anda benar-benar ingin memiliki label kolom yang cocok untuk memastikan itu bergabung
sumber