Saya ingin menggabungkan dua DataFrames
, dan menyimpan indeks dari bingkai pertama sebagai indeks pada kumpulan data yang digabungkan. Namun, ketika saya melakukan penggabungan, DataFrame yang dihasilkan memiliki indeks integer. Bagaimana saya dapat menentukan bahwa saya ingin menyimpan indeks dari bingkai data kiri?
In [4]: a = pd.DataFrame({'col1': {'a': 1, 'b': 2, 'c': 3},
'to_merge_on': {'a': 1, 'b': 3, 'c': 4}})
In [5]: b = pd.DataFrame({'col2': {0: 1, 1: 2, 2: 3},
'to_merge_on': {0: 1, 1: 3, 2: 5}})
In [6]: a
Out[6]:
col1 to_merge_on
a 1 1
b 2 3
c 3 4
In [7]: b
Out[7]:
col2 to_merge_on
0 1 1
1 2 3
2 3 5
In [8]: a.merge(b, how='left')
Out[8]:
col1 to_merge_on col2
0 1 1 1.0
1 2 3 2.0
2 3 4 NaN
In [9]: _.index
Out[9]: Int64Index([0, 1, 2], dtype='int64')
EDIT: Beralih ke kode contoh yang dapat direproduksi dengan mudah
Jawaban:
Catatan: untuk beberapa operasi penggabungan kiri, Anda mungkin akan mendapatkan lebih banyak baris jika ada beberapa kecocokan antara
a
danb
dan Anda perlu menghapus duplikat ( dokumentasi untuk deduplikasi ). Inilah mengapa panda tidak menyimpan indeks untuk Anda.sumber
a
bingkai aslinya . reset_index memindahkan indeks ke kolom biasa dan set_index dari kolom ini setelah penggabungan juga menangani saat baris a digandakan / dihapus karena operasi penggabungan.a.reset_index().merge(b, how="left").set_index(a.index.names)
.Anda dapat membuat salinan indeks di dataframe kiri dan melakukan penggabungan.
Saya menemukan metode sederhana ini sangat berguna saat bekerja dengan kerangka data besar dan menggunakan
pd.merge_asof()
(ataudd.merge_asof()
).Pendekatan ini akan lebih baik jika pengaturan ulang indeks mahal (dataframe besar).
sumber
Ada solusi non-pd.merge. Menggunakan
map
danset_index
Dan, tidak memperkenalkan
index
nama tiruan untuk indeks.sumber
pd.Dataframe
dan bukan apd.Series
. The.map()
Metode hanya didefinisikan untukpd.Series
. Artinya:a[['to_merge_on_1', 'to_merge_on_2']].map(...)
tidak akan berhasil.Hal ini memungkinkan untuk mempertahankan indeks df1
sumber
on=list_of_cols]
, bertentangan dokumentasi:If joining columns on columns, the DataFrame indexes *will be ignored*
. Apakah salah satu penggunaan indeks vs. kolom diutamakan?Pikir saya telah menemukan solusi yang berbeda. Saya bergabung dengan tabel kiri pada nilai indeks dan tabel kanan pada nilai kolom berdasarkan indeks tabel kiri. Apa yang saya lakukan adalah penggabungan normal:
Kemudian saya mengambil nomor indeks baru dari tabel gabungan dan meletakkannya di kolom baru bernama Nomor Garis Sentimen:
Kemudian saya secara manual mengatur indeks kembali ke indeks tabel kiri asli berdasarkan kolom yang sudah ada yang disebut Nomor Baris (nilai kolom tempat saya bergabung dari indeks tabel kiri):
Kemudian dihapus nama index dari Line Number agar tetap kosong:
Mungkin sedikit hack tetapi tampaknya berfungsi dengan baik dan relatif sederhana. Selain itu, tebak itu mengurangi risiko duplikat / mengacaukan data Anda. Semoga semuanya masuk akal.
sumber
Pilihan sederhana lainnya adalah mengganti nama indeks menjadi sebelumnya:
merge mempertahankan urutan pada dataframe 'a', tetapi hanya menyetel ulang indeks sehingga simpan untuk menggunakan set_axis
sumber