Ekspor data dari beberapa sistem jarang menghasilkan struktur kolom yang persis sama. Tabel dari cabang Barat memuat tiga kolom laporan, sedangkan tabel dari cabang Timur menambahkan kolom kota dan menyusun kolomnya dengan urutan berbeda. Ketika semua tabel tersebut harus menjadi satu laporan bulanan, kita menumpuk barisnya secara vertikal dengan pd.concat(). Chapter ini membahas penulisan axis=0 secara eksplisit, aturan penyelarasan kolom berdasarkan nama, dan strategi menangani kolom yang tidak dimiliki semua sumber.
Penumpukan Vertikal dengan axis=0 #
Chapter sebelumnya sudah memakai pd.concat() dalam bentuk paling sederhana, yaitu tanpa parameter arah. Pada Chapter ini kita menuliskan axis=0 secara eksplisit agar maksud kode terbaca jelas. Nilai 0 merujuk pada sumbu baris: pandas menempelkan tabel kedua di bawah tabel pertama, dan jumlah baris hasil sama dengan jumlah seluruh baris tabel sumber. Jumlah kolom tidak bertambah karena tidak ada data baru yang masuk dari samping. Menulis parameter ini secara eksplisit tidak mengubah hasil; manfaatnya ada pada keterbacaan kode ketika list sumber bertambah panjang.
Kolom Disejajarkan Berdasarkan Nama #
Struktur dua tabel pada contoh berikut sengaja dibuat tidak seragam. Tabel cabang_barat menyusun kolomnya berurutan produk, unit, omzet, sedangkan tabel cabang_timur menyusunnya omzet, unit, produk dengan satu kolom tambahan kota. Skrip berikut menggabungkan keduanya dengan dua strategi.
import pandas as pd
cabang_barat = pd.DataFrame({
"produk": ["Kopi Gayo", "Teh Melati"],
"unit": [12, 30],
"omzet": [1020000, 960000],
})
cabang_timur = pd.DataFrame({
"omzet": [576000, 3400000],
"unit": [18, 40],
"produk": ["Teh Melati", "Kopi Gayo"],
"kota": ["Surabaya", "Malang"],
})
tumpukan = pd.concat([cabang_barat, cabang_timur], axis=0, ignore_index=True)
print(tumpukan)
print()
kolom_sama = ["produk", "unit", "omzet"]
seragam = pd.concat(
[cabang_barat[kolom_sama], cabang_timur[kolom_sama]],
ignore_index=True,
)
print(seragam)Output yang Dihasilkan:
produk unit omzet kota
0 Kopi Gayo 12 1020000 NaN
1 Teh Melati 30 960000 NaN
2 Teh Melati 18 576000 Surabaya
3 Kopi Gayo 40 3400000 Malang
produk unit omzet
0 Kopi Gayo 12 1020000
1 Teh Melati 30 960000
2 Teh Melati 18 576000
3 Kopi Gayo 40 3400000Mari kita telaah apa yang terjadi pada kode di atas:
- Baris 3-7: DataFrame
cabang_baratdibuat dengan urutan kolomproduk,unit,omzet. - Baris 9-14: DataFrame
cabang_timurdibuat dengan urutan kolomomzet,unit,produkplus kolomkota; urutan ini sengaja dibalik dari tabel pertama. - Baris 16-17:
pd.concat()denganaxis=0menumpuk kedua tabel; hasil pada output menunjukkan kolom tersusun rapiproduk,unit,omzet,kota. - Baris 20-24: kedua tabel terlebih dahulu dipilih hanya kolom
kolom_sama, lalu digabung ulang; hasilnya empat baris tanpa kolomkotadan tanpaNaN.
Pada tabel pertama output, nilai omzet dan unit setiap baris tetap benar meskipun urutan kolom kedua tabel dibalik. Alasannya: pandas mencocokkan kolom berdasarkan nama kolom, bukan berdasarkan posisi kolom. Nilai omzet dari cabang_timur ditempatkan ke kolom omzet hasil karena keduanya memakai label yang sama.
Menangani Kolom yang Tidak Dimiliki Semua Sumber #
Tabel pertama pada output memuat NaN di kolom kota untuk dua baris pertama karena cabang_barat tidak memiliki kolom tersebut. Kita punya dua pilihan utama. Pilihan pertama adalah memilih kolom bersama sebelum penggabungan, persis seperti baris 20-24 pada skrip; hasilnya bebas NaN, tetapi informasi kota ikut terbuang. Pilihan kedua adalah membiarkan NaN lalu menanganinya setelah penggabungan, misalnya mengisi sel kosong dengan fillna() atau membuang baris dengan dropna() sesuai kebutuhan laporan; kedua method tersebut sudah kita pelajari pada Section Data Cleaning. Untuk laporan penjualan bulanan, pilihan kedua biasanya lebih disukai karena informasi cabang tetap utuh.
Halaman pandas.concat
mendokumentasikan perilaku penyelarasan kolom ini secara formal, dan panduan merging
menunjukkan variasi lain yang bisa dicoba. Penumpukan baris menyelesaikan masalah data yang tersusun vertikal dari banyak sumber. Ketika kebutuhan kita justru menambah kolom dari tabel lain, penentu keberhasilannya berpindah ke index baris; itulah topik Chapter berikutnya tentang penyandingan horizontal dengan axis=1.