Co-founder DataCamp, Jonathan Cornelissen, dan Martijn Theuwissen memecah tren data teratas yang mereka lihat di ruang data saat ini, serta prediksi mereka untuk masa depan industri data
Dalam situasi sains data dunia nyata apa pun dengan Python, Anda akan berada sekitar 10 menit ketika Anda harus menggabungkan atau menggabungkan Pandas Dataframes bersama untuk membentuk kumpulan data analisis Anda. Menggabungkan dan menggabungkan kerangka data adalah proses inti yang perlu dikuasai oleh setiap calon analis data. Posting blog ini membahas proses penggabungan kumpulan data, yaitu menggabungkan dua kumpulan data bersama-sama berdasarkan kolom umum di antara mereka. Topik utama dibahas di sini
- ?
- ?
Jika Anda ingin mengerjakan sendiri tutorialnya, saya menggunakan penyiapan notebook Jupyter dengan Python dari Anaconda, dan saya telah memposting kodenya di GitHub di sini. Saya telah menyertakan contoh kumpulan data di repositori GitHub
Data contoh
Untuk postingan kali ini, saya mengambil beberapa data real dari aplikasi KillBiller dan beberapa data hasil download, yang terdapat dalam tiga file CSV
- pengguna_penggunaan. csv – Kumpulan data pertama yang berisi statistik penggunaan seluler bulanan pengguna
- perangkat_pengguna. csv – Kumpulan data kedua yang berisi detail “penggunaan” individu sistem, dengan tanggal dan informasi perangkat
- android_devices. csv – Kumpulan data ketiga dengan data perangkat dan pabrikan, yang mencantumkan semua perangkat Android dan kode modelnya, diperoleh dari Google di sini
Kita dapat memuat file CSV ini sebagai Pandas DataFrames ke dalam panda menggunakan perintah Pandas read_csv, dan memeriksa konten menggunakan perintah
Ada atribut penautan antara set data sampel yang penting untuk diperhatikan – "use_id" digunakan bersama antara user_usage dan user_device, dan kolom "device" pada user_device dan kolom "Model" pada set data perangkat berisi kode umum
Masalah sampel
Kami ingin menentukan apakah pola penggunaan untuk pengguna berbeda di antara perangkat yang berbeda. Misalnya, apakah pengguna yang menggunakan perangkat Samsung menggunakan lebih banyak menit panggilan daripada pengguna perangkat LG?
Kami ingin membentuk kerangka data tunggal dengan kolom untuk angka penggunaan pengguna (panggilan per bulan, sms per bulan, dll.) Dan juga kolom dengan informasi perangkat (model, pabrikan, dll.). Kita perlu "menggabungkan" (atau "menggabungkan") kumpulan data sampel kita menjadi satu kumpulan data tunggal untuk dianalisis
Menggabungkan DataFrame
“Menggabungkan” dua set data adalah proses menyatukan dua set data menjadi satu, dan menyelaraskan baris dari masing-masing berdasarkan atribut atau kolom yang sama
Kata "menggabungkan" dan "bergabung" digunakan secara relatif bergantian di Panda dan bahasa lain, yaitu SQL dan R. Di Panda, ada fungsi “merge” dan “” yang terpisah, keduanya melakukan hal serupa
Dalam skenario contoh ini, kita perlu melakukan dua langkah
- Untuk setiap baris dalam dataset user_usage – buat kolom baru yang berisi kode “device” dari kerangka data user_devices. saya. e. untuk baris pertama, use_id adalah 22787, jadi kita pergi ke kumpulan data user_devices, temukan use_id 22787, dan salin nilai dari kolom "perangkat" ke seberang
- Setelah selesai, kami mengambil kolom perangkat baru, dan menemukan "Branding Ritel" dan "Model" yang sesuai dari set data perangkat
- Terakhir, kita dapat melihat berbagai statistik untuk data pemisahan dan pengelompokan penggunaan oleh produsen perangkat yang digunakan
Bisakah saya menggunakan for loop?
Ya. Anda dapat menulis for loop untuk tugas ini. Yang pertama akan mengulang melalui use_id di set data user_usage, dan kemudian menemukan elemen yang tepat di user_devices. Loop for kedua akan mengulangi proses ini untuk perangkat
Namun, menggunakan for loop akan jauh lebih lambat dan lebih bertele-tele daripada menggunakan fungsi gabungan Pandas. Jadi, jika Anda mengalami situasi ini – jangan gunakan for loop
Menggabungkan user_usage dengan user_devices
Mari kita lihat bagaimana kita dapat menambahkan kolom "perangkat" dan "platform" dengan benar ke kerangka data user_usage menggunakan perintah Pandas Merge
result = pd.merge(user_usage, user_device[['use_id', 'platform', 'device']], on='use_id') result.head()Jadi itu berhasil, dan sangat mudah. Sekarang – bagaimana cara kerjanya? . gabungkan perintah lakukan?
Perintah penggabungan adalah tujuan pembelajaran utama dari postingan ini. Operasi penggabungan paling sederhana mengambil kerangka data kiri (argumen pertama), kerangka data kanan (argumen kedua), dan kemudian nama kolom gabungan, atau kolom untuk menggabungkan "pada". Dalam keluaran/hasil, baris dari bingkai data kiri dan kanan dicocokkan jika ada nilai umum dari kolom gabungan yang ditentukan oleh "on"
Dengan hasil ini, kita sekarang dapat melanjutkan untuk mendapatkan pabrikan dan nomor model dari kumpulan data "perangkat". Namun, pertama-tama kita perlu memahami lebih banyak tentang tipe gabungan dan ukuran kerangka data keluaran
Jenis gabungan dalam, Kiri, dan kanan
Dalam contoh kami di atas, kami menggabungkan user_usage dengan user_devices. Pratinjau head() hasilnya terlihat bagus, tetapi ada lebih dari yang terlihat. Pertama, mari kita lihat ukuran atau bentuk input dan output kita ke perintah penggabungan
Mengapa hasilnya berbeda ukuran dengan kedua kerangka data asli?
Secara default, operasi penggabungan Panda bekerja dengan penggabungan "dalam". Penggabungan dalam, (atau gabungan dalam) hanya menyimpan nilai umum di kerangka data kiri dan kanan untuk hasilnya. Dalam contoh kita di atas, hanya baris yang berisi nilai use_id yang umum antara user_usage dan user_device yang tersisa di dataset hasil. Kami dapat memvalidasi ini dengan melihat berapa banyak nilai yang umum
Ada 159 nilai use_id di tabel user_usage yang muncul di user_device. Ini adalah nilai yang sama yang juga muncul di bingkai data hasil akhir (159 baris)
Jenis Penggabungan Lainnya
Ada tiga jenis gabungan yang tersedia di Pandas. Jenis penggabungan ini umum di sebagian besar basis data dan bahasa berorientasi data (SQL, R, SAS) dan biasanya disebut sebagai "gabungan". Jika Anda tidak mengetahuinya, pelajari sekarang
- Inner Merge / Inner join – Perilaku Pandas default, hanya menyimpan baris di mana gabungan nilai “on” ada di kerangka data kiri dan kanan
- Gabungan Kiri/Gabungan luar kiri – (alias gabungan kiri atau gabungan kiri) Pertahankan setiap baris di bingkai data kiri. Jika ada nilai yang hilang dari variabel "on" di bingkai data kanan, tambahkan nilai kosong / NaN pada hasilnya
- Right Merge / Right outer join – (alias right merge atau right join) Pertahankan setiap baris dalam kerangka data yang tepat. Jika ada nilai yang hilang dari variabel "on" di kolom kiri, tambahkan nilai kosong / NaN pada hasilnya
- Gabungan Luar / Gabungan luar penuh – Gabungan luar penuh menampilkan semua baris dari kerangka data kiri, semua baris dari kerangka data kanan, dan mencocokkan baris jika memungkinkan, dengan NaN di tempat lain
Jenis gabungan yang akan digunakan ditentukan menggunakan parameter "bagaimana" dalam perintah gabungan, mengambil nilai "kiri", "kanan", "dalam" (default), atau "luar"
Diagram Venn umumnya digunakan untuk mencontohkan berbagai jenis penggabungan dan penggabungan. Lihat contoh ini dari Stack overflow
Jika ini baru bagi Anda, atau Anda melihat hal di atas dengan cemberut, luangkan waktu untuk menonton video tentang "menggabungkan bingkai data" dari Coursera untuk penjelasan lain yang mungkin membantu. Sekarang kita akan melihat setiap jenis gabungan secara lebih mendetail, dan mengerjakan masing-masing contoh
Contoh penggabungan kiri / left join
Mari ulangi operasi penggabungan, tetapi kali ini lakukan "penggabungan kiri" di Pandas
- Awalnya, kerangka data hasil memiliki 159 baris, karena ada 159 nilai umum "use_id" antara kerangka data kiri dan kanan kami dan penggabungan "dalam" digunakan secara default
- Untuk penggabungan kiri kami, kami berharap hasilnya memiliki jumlah baris yang sama dengan kerangka data kiri kami "penggunaan_pengguna" (240), dengan nilai yang hilang untuk semua kecuali 159 dari kolom "platform" dan "perangkat" yang digabungkan (81 baris)
- Kami berharap hasilnya memiliki jumlah baris yang sama dengan bingkai data kiri karena setiap use_id di user_usage hanya muncul sekali di user_device. Pemetaan satu-ke-satu tidak selalu demikian. Dalam operasi penggabungan di mana satu baris di bingkai data kiri dicocokkan dengan banyak baris di bingkai data kanan, beberapa baris hasil akan dihasilkan. saya. e. jika nilai use_id di user_usage muncul dua kali di kerangka data user_device, akan ada dua baris untuk use_id itu di hasil gabungan
Anda dapat mengubah penggabungan menjadi penggabungan kiri dengan parameter "bagaimana" ke perintah penggabungan Anda. Bagian atas bingkai data hasil berisi item yang berhasil dicocokkan, dan di bagian bawah berisi baris di user_usage yang tidak memiliki use_id yang sesuai di user_device
result = pd.merge(user_usage, user_device[['use_id', 'platform', 'device']], on='use_id', how='left')_Contoh penggabungan kanan / right join
Sebagai contoh, kita dapat mengulangi proses ini dengan penggabungan kanan / penggabungan kanan, cukup dengan mengganti how='left' dengan how='right' dalam perintah penggabungan Pandas
result = pd.merge(user_usage, user_device[['use_id', 'platform', 'device']], on='use_id', how='right')Hasil yang diharapkan akan memiliki jumlah baris yang sama dengan kerangka data kanan, perangkat_pengguna, tetapi memiliki beberapa nilai kosong, atau NaN di kolom yang berasal dari kerangka data kiri, penggunaan_pengguna (yaitu "menit_keluar_per_bulan", "sms_keluar_per_bulan", dan "bulanan_mb"). Sebaliknya, kami berharap tidak ada nilai yang hilang di kolom yang berasal dari kerangka data yang tepat, "perangkat_pengguna"
Contoh gabungan luar / gabungan luar penuh
Terakhir, kami akan melakukan penggabungan luar menggunakan Pandas, juga disebut sebagai "gabungan luar penuh" atau hanya "gabungan luar". Gabungan luar dapat dilihat sebagai kombinasi gabungan kiri dan kanan, atau kebalikan dari gabungan dalam. Dalam gabungan luar, setiap baris dari kerangka data kiri dan kanan dipertahankan dalam hasil, dengan NaN di mana tidak ada variabel gabungan yang cocok
Dengan demikian, kami mengharapkan hasil memiliki jumlah baris yang sama karena ada nilai "use_id" yang berbeda antara perangkat_pengguna dan penggunaan_pengguna, yaitu. e. setiap nilai gabungan dari kerangka data kiri akan menjadi hasil bersama dengan setiap nilai dari kerangka data kanan, dan mereka akan ditautkan jika memungkinkan
Pada diagram di bawah ini, baris contoh dari hasil penggabungan luar ditampilkan, dua baris pertama adalah contoh di mana "use_id" umum di antara kerangka data, dua baris kedua hanya berasal dari kerangka data kiri, dan dua baris terakhir hanya berasal dari kanan
Menggunakan indikator gabungan untuk melacak gabungan
Untuk membantu mengidentifikasi dari mana asal baris, Pandas menyediakan parameter "indikator" yang dapat digunakan dengan fungsi penggabungan yang membuat kolom tambahan yang disebut "_merge" di keluaran yang memberi label sumber asli untuk setiap baris
result = pd.merge(user_usage, user_device[['use_id', 'platform', 'device']], on='use_id', how='outer', indicator=True)Penggabungan Terakhir – Menggabungkan detail perangkat ke hasil
Kembali ke masalah awal kita, kita telah menggabungkan user_usage dengan user_device, jadi kita memiliki platform dan perangkat untuk setiap pengguna. Awalnya, kami menggunakan "penggabungan dalam" sebagai default di Pandas, dan karena itu, kami hanya memiliki entri untuk pengguna yang juga memiliki informasi perangkat. Kami akan mengulangi penggabungan ini menggunakan gabungan kiri untuk mempertahankan semua pengguna, lalu menggunakan penggabungan kiri kedua untuk akhirnya mendapatkan produsen perangkat dalam kerangka data yang sama
# First, add the platform and device to the user usage - use a left join this time. result = pd.merge(user_usage, user_device[['use_id', 'platform', 'device']], on='use_id', how='left') # At this point, the platform and device columns are included # in the result along with all columns from user_usage # Now, based on the "device" column in result, match the "Model" column in devices. devices.rename(columns={"Retail Branding": "manufacturer"}, inplace=True) result = pd.merge(result, devices[['manufacturer', 'Model']], left_on='device', right_on='Model', how='left') print(result.head())_Menggunakan left_on dan right_on untuk menggabungkan dengan nama kolom yang berbeda
Kolom yang digunakan dalam operator gabungan tidak perlu diberi nama yang sama di kerangka data kiri dan kanan. Pada penggabungan kedua di atas, perhatikan bahwa ID perangkat disebut "perangkat" di bingkai data kiri, dan disebut "Model" di bingkai data kanan
Nama kolom yang berbeda ditentukan untuk penggabungan di Panda menggunakan parameter “left_on” dan “right_on”, bukan hanya menggunakan parameter “on”
Menghitung statistik berdasarkan perangkat
Dengan penggabungan kami selesai, kami dapat menggunakan fungsionalitas agregasi data Panda untuk dengan cepat mengetahui penggunaan rata-rata untuk pengguna berdasarkan produsen perangkat. Perhatikan bahwa ukuran sampel yang kecil membuat grup yang lebih kecil lagi, jadi saya tidak akan mengaitkan signifikansi statistik apa pun dengan hasil khusus ini
result.groupby("manufacturer").agg({ "outgoing_mins_per_month": "mean", "outgoing_sms_per_month": "mean", "monthly_mb": "mean", "use_id": "count" })Menjadi master penggabungan – Bagian 2
Itu melengkapi bagian pertama dari tutorial penggabungan ini. Anda sekarang harus menguasai dasar-dasar penggabungan, dan dapat mengatasi masalah penggabungan dan penggabungan Anda sendiri dengan informasi di atas. Bagian 2 dari posting blog ini membahas topik lanjutan berikut
- Bagaimana Anda menggabungkan bingkai data menggunakan beberapa kolom gabungan/umum?
- Bagaimana cara menggabungkan kerangka data berdasarkan indeks kerangka data?
- Apa perbedaan antara fungsi gabung dan gabung di Pandas?
- Seberapa cepat penggabungan di Python Pandas?
Sumber daya bermanfaat lainnya
Jangan biarkan penguasaan penggabungan Anda berhenti di sini. Coba tautan berikut untuk penjelasan dan informasi lebih lanjut tentang topik tersebut