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.

python
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:

text
       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  3400000

Mari kita telaah apa yang terjadi pada kode di atas:

  1. Baris 3-7: DataFrame cabang_barat dibuat dengan urutan kolom produk, unit, omzet.
  2. Baris 9-14: DataFrame cabang_timur dibuat dengan urutan kolom omzet, unit, produk plus kolom kota; urutan ini sengaja dibalik dari tabel pertama.
  3. Baris 16-17: pd.concat() dengan axis=0 menumpuk kedua tabel; hasil pada output menunjukkan kolom tersusun rapi produk, unit, omzet, kota.
  4. Baris 20-24: kedua tabel terlebih dahulu dipilih hanya kolom kolom_sama, lalu digabung ulang; hasilnya empat baris tanpa kolom kota dan tanpa NaN.

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.