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.
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:
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 168000Mari kita telaah kode di atas:
- Baris 3-10: DataFrame penjualan dibangun dengan harga, jumlah, dan diskon berupa teks; output pertama memperlihatkan keempat kolom bertipe str.
- Baris 15-17: astype(“int64”) mengonversi harga dan jumlah ke bilangan bulat, sedangkan astype(“float64”) mengonversi diskon ke bilangan desimal.
- Baris 19-20: dtypes setelah konversi menunjukkan int64, int64, dan float64.
- Baris 21-22: penjumlahan antar kolom kini dihitung sebagai angka; kolom total berisi 1020000, 960000, 600000, dan 168000.
- 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.
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:
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: objectMari kita telaah kode di atas:
- Baris 3-8: kolom jumlah berisi “12”, “30”, dan satu nilai non-angka berupa “habis”.
- Baris 10-13: blok try/except menangkap ValueError dari astype(“int64”) dan menampilkan pesannya: invalid literal for int() with base 10: ‘habis’.
- Baris 16: pd.to_numeric(catatan[“jumlah”], errors=“coerce”) mengonversi nilai yang valid dan mengganti “habis” dengan NaN.
- 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 sasaran | Cocok 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.