Saya memiliki 3 file CSV. Masing-masing memiliki kolom pertama sebagai nama (string) orang, sedangkan semua kolom lainnya di setiap bingkai data adalah atribut orang tersebut.
Bagaimana saya bisa "bergabung" bersama ketiga dokumen CSV untuk membuat CSV tunggal dengan setiap baris memiliki semua atribut untuk setiap nilai unik dari nama string seseorang?
The join()
fungsi dalam panda menetapkan bahwa saya perlu multiindex, tapi aku bingung tentang apa skema pengindeksan hirarkis harus dilakukan dengan membuat bergabung berdasarkan indeks tunggal.
df1.join([df2, df3], on=[df2_col1, df3_col1])
tidak berhasil.Jawaban:
Impor yang diasumsikan:
Jawaban John Galt pada dasarnya adalah
reduce
operasi. Jika saya memiliki lebih dari beberapa dataframe, saya akan meletakkannya dalam daftar seperti ini (dihasilkan melalui pemahaman daftar atau loop atau yang lainnya):Dengan asumsi mereka memiliki beberapa kolom umum, seperti
name
pada contoh Anda, saya akan melakukan hal berikut:Dengan begitu, kode Anda harus bekerja dengan jumlah bingkai data berapa pun yang ingin Anda gabungkan.
Edit 1 Agustus 2016 : Bagi mereka yang menggunakan Python 3:
reduce
telah dipindahkan kefunctools
. Jadi untuk menggunakan fungsi ini, pertama-tama Anda harus mengimpor modul itu:sumber
reduce
diganti denganfunctools.reduce
Soimport functools functools.reduce(.......)
name1
,name2
danname3
masing - masing.n-1
panggilan ke fungsi penggabungan? Saya kira dalam hal ini di mana jumlah dataframe kecil itu tidak masalah, tapi saya ingin tahu apakah ada solusi yang lebih scalable.df
dengan kolom multi indeks (itu menyuntikkan 'on' sebagai kolom yang bekerja untuk penggabungan pertama, tetapi penggabungan berikutnya gagal), alih-alih saya membuatnya bekerja dengan:df = reduce(lambda left, right: left.join(right, how='outer', on='Date'), dfs)
Anda dapat mencoba ini jika Anda memiliki 3 kerangka data
alternatifnya, seperti yang disebutkan oleh cwharland
sumber
df1.merge(df2,on='name').merge(df3,on='name')
name1
,name2
danname3
masingdf1.merge(df2,left_on='name1', right_on='name2').merge(df3,left_on='name1', right_on='name3').drop(columns=['name2', 'name3']).rename(columns={'name1':'name'})
Ini adalah situasi yang ideal untuk
join
metode iniThe
join
Metode ini dibangun tepat untuk jenis situasi. Anda dapat bergabung dengan sejumlah DataFrames bersama dengannya. DataFrame panggilan bergabung dengan indeks koleksi DataFrames yang disahkan. Untuk bekerja dengan beberapa DataFrames, Anda harus meletakkan kolom yang bergabung dalam indeks.Kode akan terlihat seperti ini:
Dengan data nol, Anda dapat melakukan ini:
sumber
pd.DataFrame().join(dfs, how="outer")
. Ini bisa lebih bersih dalam beberapa situasi.pd.concat
akan menghasilkan sintaks sederhana:pd.concat([df.set_index('name') for df in dfs], axis=1, join='inner').reset_index()
.concat
juga lebih fleksibel ketika berhadapan dengan nama kolom duplikat di beberapa dfs (join
tidak sebagus ini) meskipun Anda hanya dapat melakukan bergabung dalam atau luar dengan itu.dfs[0].join(dfs[1:])
harus dieditdfs[0].join(dfs[1:], sort=False)
karena jika tidakFutureWarning
kehendak muncul. Terima kasih untuk contoh yang bagus.ValueError: Indexes have overlapping values
:, meskipun, dengan memeriksa masing-masing kerangka data dalam daftar, mereka tampaknya tidak memiliki nilai yang tumpang tindih.Ini juga dapat dilakukan sebagai berikut untuk daftar kerangka data
df_list
:atau jika kerangka data berada dalam objek generator (mis. untuk mengurangi konsumsi memori):
sumber
Di
python
3.6.3 denganpandas
0.22.0 Anda juga dapat menggunakanconcat
selama Anda menetapkan indeks kolom yang ingin Anda gunakan untuk bergabungdimana
df1
,,df2
dandf3
didefinisikan seperti dalam jawaban John Galtsumber
Seseorang tidak memerlukan multiindex untuk melakukan operasi gabungan . Satu hanya perlu mengatur dengan benar kolom indeks untuk melakukan operasi gabungan (perintah yang
df.set_index('Name')
misalnya)The
join
operasi secara default dilakukan pada indeks. Dalam kasus Anda, Anda hanya perlu menentukan bahwaName
kolom tersebut sesuai dengan indeks Anda. Di bawah ini adalah contohnyaSebuah tutorial mungkin berguna.
sumber
Berikut adalah metode untuk menggabungkan kamus bingkai data sambil tetap menyinkronkan nama kolom dengan kamus. Juga mengisi nilai yang hilang jika diperlukan:
Ini adalah fungsi untuk menggabungkan dict dari frame data
Oke, mari kita hasilkan data dan uji ini:
sumber
Solusi sederhana:
Jika nama kolom serupa:
Jika nama kolom berbeda:
sumber
Ada solusi lain dari dokumentasi panda (yang tidak saya lihat di sini),
menggunakan
.append
Yang
ignore_index=True
digunakan untuk mengabaikan indeks dari dataframe ditambahkan, menggantinya dengan indeks yang tersedia berikutnya dalam satu sumber.Jika ada nama kolom yang berbeda,
Nan
akan diperkenalkan.sumber
Tiga kerangka data adalah
Mari kita gabungkan frame ini menggunakan pd.merge bersarang
Di sini kita pergi, kita memiliki kerangka data gabungan kami.
Analisis Selamat !!!
sumber