Pandas concat: Menyatukan Beberapa DataFrame
TL;DR
pandas concat menyatukan beberapa DataFrame dengan menumpuknya, ke bawah (axis=0) atau ke samping (axis=1). Sintaksnya pd.concat([df1, df2], ignore_index=True). Beda dari merge, concat nggak nyocokin kolom kunci, dia cuma numpuk. Pakai concat buat gabungin file penjualan beberapa bulan jadi satu.
pandas concat itu cara numpuk beberapa DataFrame jadi satu, entah ke bawah atau ke samping.
Punya file penjualan Januari, Februari, dan Maret yang strukturnya sama? concat nyatuin ketiganya jadi satu DataFrame panjang dalam satu baris kode. Nggak perlu copy paste manual.
Di artikel ini kamu bakal belajar cara numpuk ke bawah, numpuk ke samping, ngatur ulang index, dan bedanya concat sama merge biar kamu nggak salah pilih.
Apa itu pandas concat?
pandas concat adalah fungsi buat nyatuin beberapa DataFrame dengan cara numpuk. Kamu kasih daftar DataFrame, dan pandas nyambungin semuanya jadi satu. Arah numpuknya diatur lewat parameter axis: ke bawah buat nambah baris, atau ke samping buat nambah kolom.
Sintaks dasarnya:
import pandas as pd
hasil = pd.concat([df1, df2, df3], ignore_index=True)Bagian pentingnya:
- daftar DataFrame: taruh dalam kurung siku, bisa dua atau lebih.
- ignore_index: True buat nomorin ulang index dari 0.
- axis: 0 numpuk ke bawah (default), 1 numpuk ke samping.
Beda sama merge yang nyocokin kolom kunci, concat cuma numpuk apa adanya. Kalau kamu butuh gabung berdasarkan ID yang cocok, pakai pandas merge, bukan concat.
Gimana cara concat ke bawah (menambah baris)?
Buat numpuk DataFrame ke bawah, pakai axis=0, yang juga default-nya. pandas nyambungin baris dari tiap DataFrame secara berurutan. Ini kepakai buat gabungin data periode yang beda dengan kolom yang sama.
jan = pd.read_csv("penjualan_jan.csv")
feb = pd.read_csv("penjualan_feb.csv")
mar = pd.read_csv("penjualan_mar.csv")
q1 = pd.concat([jan, feb, mar], ignore_index=True)Hasilnya satu DataFrame berisi semua baris dari tiga bulan. Parameter ignore_index=True penting di sini. Tanpa itu, index dari tiap file bakal keikut, jadi kamu punya angka index yang berulang, misal 0, 1, 2, 0, 1, 2.
pandas nyocokin kolom berdasarkan namanya, bukan urutannya. Jadi kalau file Februari kolomnya beda urutan, concat tetap naruh nilai di kolom yang benar.
Gimana kalau kolom antar file nggak sama?
Kalau ada kolom yang cuma muncul di sebagian DataFrame, concat tetap jalan tapi ngisi NaN di baris yang nggak punya kolom itu. Ini perilaku default yang disebut join luar.
hasil = pd.concat([df1, df2], ignore_index=True)
# kolom yang cuma ada di df2 diisi NaN untuk baris df1Kalau kamu cuma mau simpan kolom yang ada di semua DataFrame, pakai join="inner":
hasil = pd.concat([df1, df2], join="inner", ignore_index=True)Dengan inner, kolom yang nggak ada di salah satu DataFrame bakal dibuang. Pilih outer kalau kamu mau semua kolom, inner kalau kamu mau yang bersih dan lengkap aja.
Gimana cara concat ke samping (menambah kolom)?
Buat numpuk ke samping, pakai axis=1. pandas nempelin kolom dari DataFrame kedua ke kanan DataFrame pertama, dicocokin berdasarkan index barisnya.
hasil = pd.concat([df_kiri, df_kanan], axis=1)Hati-hati di sini. concat axis=1 nyocokin baris pakai index, bukan pakai kolom kunci. Kalau index dua DataFrame nggak sejajar, kamu bakal dapat NaN atau baris yang salah pasang. Buat nyambungin berdasarkan nilai kunci, merge lebih aman.
Aturan praktisnya: pakai concat axis=1 cuma kalau kamu yakin dua DataFrame punya index yang sama dan urutan baris yang sama persis. Kalau ragu, pakai merge.
Contoh kasus: gabung laporan bulanan toko_berkah
Toko_berkah simpan penjualan dalam file terpisah per bulan. Buat laporan kuartal, aku harus gabungin 3 file: Januari 4.100 baris, Februari 3.850 baris, Maret 4.320 baris.
files = ["jan.csv", "feb.csv", "mar.csv"]
dfs = [pd.read_csv(f) for f in files]
q1 = pd.concat(dfs, ignore_index=True)
print(len(q1)) # 12.270 barisTotal 12.270 baris kegabung dalam satu baris kode. Tapi ada jebakan yang aku temuin: 340 baris ternyata duplikat, transaksi akhir Januari kecatat juga di awal file Februari.
Setelah aku cek pakai q1.duplicated().sum(), ketemu 340 baris ganda atau 2,8% dari total. Kalau nggak dibuang, revenue kuartal kehitung lebih Rp 4,1 juta. Aku bersihin pakai q1 = q1.drop_duplicates() sebelum lanjut analisa.
Pelajaran: concat itu cepat, tapi dia numpuk apa adanya tanpa ngecek duplikat. Selalu cek baris ganda setelah gabung file yang periodenya bersinggungan. Buat alur bersih data lengkapnya, cek panduan pengolahan data.
Kesalahan umum waktu pakai concat
- Lupa ignore_index. Tanpa itu, index berulang dan bikin bingung waktu kamu akses baris pakai loc.
- Pakai concat padahal butuh merge. concat numpuk, merge nyocokin kunci. Kalau kamu mau gabung berdasarkan ID, pakai merge.
- Nggak cek duplikat setelah gabung. File yang periodenya tumpang tindih sering bikin baris ganda. Cek pakai drop_duplicates.
- Salah axis. axis=0 nambah baris, axis=1 nambah kolom. Ketuker bikin hasil yang aneh.
FAQ
Apa beda pandas concat dan merge?
concat numpuk DataFrame, entah ke bawah atau ke samping, tanpa nyocokin nilai kunci. merge nyambungin dua DataFrame berdasarkan nilai di kolom kunci yang cocok, mirip JOIN di SQL. Pakai concat kalau kamu mau nyatuin data yang strukturnya sama, misal file penjualan beberapa bulan. Pakai merge kalau kamu mau nempelin informasi dari tabel lain berdasarkan ID, misal nambahin nama produk ke tabel transaksi.
Kenapa index saya berantakan setelah concat?
Karena tiap DataFrame bawa index-nya sendiri, dan concat default-nya nyimpen index itu apa adanya. Jadi kamu dapat angka index yang berulang dari tiap sumber. Solusinya, tambahin ignore_index=True waktu concat, biar pandas nomorin ulang dari 0 sampai baris terakhir. Kalau kamu udah terlanjur concat tanpa itu, jalanin df.reset_index(drop=True) buat rapiin index-nya.
Bisa nggak concat menggabungkan lebih dari dua DataFrame?
Bisa, dan ini justru kekuatannya. Kamu tinggal taruh semua DataFrame dalam satu daftar, misal pd.concat([df1, df2, df3, df4]). Cara yang lebih rapi buat banyak file, baca semua file pakai list comprehension jadi daftar DataFrame, lalu concat sekaligus. Ini jauh lebih efisien daripada nyambungin dua-dua secara manual dan lebih gampang dibaca.
Apakah concat bisa menangani kolom yang urutannya beda?
Bisa. concat nyocokin kolom berdasarkan namanya, bukan posisinya. Jadi kalau file Februari punya kolom dengan urutan berbeda dari Januari, concat tetap naruh tiap nilai di kolom yang benar. Yang penting nama kolomnya sama persis, termasuk huruf besar kecil dan spasi. Kalau nama kolom beda tipis, misal Total dan total, pandas nganggepnya kolom berbeda dan bikin dua kolom terpisah dengan banyak NaN.
Kapan pakai join inner dan outer di concat?
Pakai outer, yang jadi default, kalau kamu mau simpan semua kolom dari semua DataFrame. Kolom yang nggak ada di salah satu DataFrame bakal diisi NaN. Pakai inner kalau kamu cuma mau kolom yang muncul di semua DataFrame, sehingga hasilnya bersih tanpa NaN. Buat gabung file bulanan yang strukturnya konsisten, outer dan inner ngasih hasil sama. Bedanya baru kerasa waktu ada kolom yang cuma ada di sebagian file.
Penutup
Yang perlu kamu inget: concat numpuk DataFrame, axis=0 ke bawah dan axis=1 ke samping. Pakai ignore_index buat rapiin nomor baris, cek duplikat setelah gabung, dan pilih merge kalau kamu butuh nyocokin kolom kunci.
Sekarang coba gabung file data kamu sendiri. Mau latihan konsep gabung data lewat SQL dulu? Cek NgulikSQL buat praktek dengan dataset Indonesia di browser.
Lanjut baca cara pandas merge gabung DataFrame, atau lihat dokumentasi resmi pandas.concat buat semua parameternya.
Mau praktek langsung? Mulai latihan SQL gratis
Latihan interaktif, langsung di browser.
Artikel terkait
NumPy reshape: Ubah Bentuk Array (2026)
Fungsi reshape di NumPy ngatur ulang bentuk array tanpa ngubah datanya. Ini cara pakainya, arti angka -1, dan cara ngeflat array.
NumPy Array: Dasar-Dasar untuk Analis Data (2026)
NumPy array bikin hitungan data di Python jauh lebih cepat dari list biasa. Ini dasar bikin, slicing, dan operasi array buat analis.
Alternatif iterrows yang Lebih Cepat di Pandas
iterrows nyaman ditulis tapi lambat. Ini urutan alternatif iterrows di pandas dari yang tercepat, plus benchmark biar kamu tau kapan pakai yang mana.