Data yang baru dibaca dari CSV atau Excel sering memiliki tipe kolom yang tidak sesuai isinya: kolom angka ikut tersimpan sebagai teks karena satu-dua baris berisi catatan, atau bilangan desimal datang sebagai string. Kolom yang seharusnya berisi angka tetapi bertipe teks tidak bisa dipakai untuk aritmetika maupun statistik, sehingga analisis terhenti di tengah jalan. Pandas menyediakan astype() untuk mengubah tipe kolom secara eksplisit, serta pd.to_numeric() untuk konversi angka yang toleran terhadap data tidak rapi. Chapter ini membahas keduanya beserta cara menangani kegagalan konversi dengan aman.

Memeriksa Tipe Kolom Terlebih Dahulu #

Langkah pertama sebelum mengubah apa pun adalah melihat tipe aktual setiap kolom lewat atribut dtypes. Pada pandas 3.0, kolom teks bertipe str, bukan object seperti pada versi lama. Ketika angka dibaca sebagai teks, dtypes tetap menampilkan str untuk kolom tersebut, dan di sinilah konversi diperlukan. Memeriksa dtypes juga berguna setelah konversi untuk memastikan hasilnya sesuai harapan.

Konversi Langsung dengan astype() #

Contoh berikut memakai tabel penjualan yang seluruh kolom angkanya tersimpan sebagai teks. Kita periksa dtypes, konversikan tiga kolom, lalu hitung kolom total sebagai bukti bahwa kolomnya kini benar-benar numerik.

python
import pandas as pd

penjualan = pd.DataFrame(
    {
        "produk": ["Kopi Gayo", "Teh Melati", "Gula Aren", "Sirup Jahe"],
        "harga": ["85000", "32000", "24000", "21000"],
        "jumlah": ["12", "30", "25", "8"],
        "diskon": ["0.1", "0.05", "0.2", "0.15"],
    }
)

print(penjualan.dtypes)
print()

penjualan["harga"] = penjualan["harga"].astype("int64")
penjualan["jumlah"] = penjualan["jumlah"].astype("int64")
penjualan["diskon"] = penjualan["diskon"].astype("float64")

print(penjualan.dtypes)
print()
penjualan["total"] = penjualan["harga"] * penjualan["jumlah"]
print(penjualan)

Output yang Dihasilkan:

text
produk    str
harga     str
jumlah    str
diskon    str
dtype: object

produk        str
harga       int64
jumlah      int64
diskon    float64
dtype: object

       produk  harga  jumlah  diskon    total
0   Kopi Gayo  85000      12    0.10  1020000
1  Teh Melati  32000      30    0.05   960000
2   Gula Aren  24000      25    0.20   600000
3  Sirup Jahe  21000       8    0.15   168000

Mari kita telaah kode di atas:

  1. Baris 3-10: DataFrame penjualan dibangun dengan harga, jumlah, dan diskon berupa teks; output pertama memperlihatkan keempat kolom bertipe str.
  2. Baris 15-17: astype(“int64”) mengonversi harga dan jumlah ke bilangan bulat, sedangkan astype(“float64”) mengonversi diskon ke bilangan desimal.
  3. Baris 19-20: dtypes setelah konversi menunjukkan int64, int64, dan float64.
  4. Baris 21-22: penjumlahan antar kolom kini dihitung sebagai angka; kolom total berisi 1020000, 960000, 600000, dan 168000.
  5. Konsekuensi: astype() mengembalikan Series baru; penugasan ke penjualan[“harga”] mengganti isi kolom pada DataFrame yang sama dengan tipe yang sudah benar.

Menangani Konversi yang Gagal #

astype() menuntut seluruh nilai pada kolom dapat dikonversi; satu nilai asing saja membuat seluruh panggilan gagal dengan ValueError. Data nyata hampir selalu mengandung nilai seperti itu, sehingga kita perlu jalur konversi yang lebih toleran: pd.to_numeric() dengan errors=“coerce”. Nilai yang tidak dapat dikonversi menjadi NaN alih-alih menggagalkan proses.

python
import pandas as pd

catatan = pd.DataFrame(
    {
        "produk": ["Kopi Gayo", "Teh Melati", "Gula Aren"],
        "jumlah": ["12", "30", "habis"],
    }
)

try:
    catatan["jumlah"] = catatan["jumlah"].astype("int64")
except ValueError as pesan:
    print("astype gagal:", pesan)
print()

catatan["jumlah"] = pd.to_numeric(catatan["jumlah"], errors="coerce")
print(catatan)
print()
print(catatan.dtypes)

Output yang Dihasilkan:

text
astype gagal: invalid literal for int() with base 10: 'habis'

       produk  jumlah
0   Kopi Gayo    12.0
1  Teh Melati    30.0
2   Gula Aren     NaN

produk        str
jumlah    float64
dtype: object

Mari kita telaah kode di atas:

  1. Baris 3-8: kolom jumlah berisi “12”, “30”, dan satu nilai non-angka berupa “habis”.
  2. Baris 10-13: blok try/except menangkap ValueError dari astype(“int64”) dan menampilkan pesannya: invalid literal for int() with base 10: ‘habis’.
  3. Baris 16: pd.to_numeric(catatan[“jumlah”], errors=“coerce”) mengonversi nilai yang valid dan mengganti “habis” dengan NaN.
  4. Baris 17-19: hasil konversi bertipe float64 karena NaN tidak bisa disimpan di int64; baris dengan NaN menandai data yang perlu diperiksa lebih lanjut.

Memilih Tipe Sasaran #

Pemilihan tipe sasaran menentukan operasi apa yang bisa dijalankan atas kolom tersebut:

Tipe sasaranCocok untuk
“int64”bilangan bulat: stok, jumlah, tahun
“float64”bilangan desimal: diskon, berat, rata-rata
“str”teks: nama, alamat, catatan
“category”teks dengan nilai berulang sedikit: status, tingkat keanggotaan
“bool”nilai benar atau salah

astype() menerima nama tipe dalam bentuk string seperti “int64”, dan astype(“category”) menyimpan nilai unik satu kali lalu menandai tiap baris dengan kategorinya sehingga tabel besar menjadi lebih ringan. Dengan tipe kolom yang tepat, data dapat kita perlakukan sesuai sifatnya: angka dihitung, teks diolah dengan operasi string. Pengolahan teks pada kolom DataFrame adalah topik Chapter berikutnya.