Tipe Data Pandas: dtypes & astype()
Pahami dtype tiap kolom, kenapa tipe yang salah bikin analisis ngaco, dan cara konversi tanggal serta angka dengan benar.
Label Kecil yang Menentukan Nasib Analisismu
Setiap kolom DataFrame punya tipe data (dtype): integer, float, object (biasanya string), boolean, datetime, dan lain-lain. Tipe ini menentukan operasi apa yang boleh dilakukan. Salah tipe, analisismu bisa ngaco tanpa kamu sadari, dan itu yang paling berbahaya.
Kenapa penting untuk data analyst? Karena data mentah hampir tidak pernah datang dengan tipe yang benar. Kolom tanggal terbaca sebagai teks, kolom angka kecampur string "n/a" lalu jadi object, dan tiba-tiba df["total"].sum() menggabungkan string bukannya menjumlahkan angka.
Membaca dtypes
Langkah pertama setiap kali buka dataset baru: cek tipe tiap kolom.
import pandas as pd
df = pd.DataFrame({
"produk": ["Kopi", "Teh", "Jus"],
"harga": [18000, 12000, 20000],
"tanggal": ["2024-01-05", "2024-01-06", "2024-01-07"],
})
print(df.dtypes)
# produk object
# harga int64
# tanggal object <- masih teks, bukan tanggal!Perhatikan kolom tanggal: isinya tanggal, tapi tipenya object (teks). Artinya kamu belum bisa mengurutkan kronologis dengan benar atau mengambil bulannya.
astype(): Konversi Tipe Manual
Untuk konversi sederhana antar tipe dasar, astype() sudah cukup.
# Kolom kode yang harusnya teks (biar nol depan tidak hilang)
df["kode"] = df["kode"].astype(str)
# Kolom flag 0/1 jadi boolean
df["is_promo"] = df["is_promo"].astype(bool)
# Angka desimal jadi integer (hati-hati, desimal dipotong!)
df["qty"] = df["qty"].astype(int)Contoh realistis, memperbaiki kolom harga yang tercampur teks:
df = pd.DataFrame({"harga": ["18000", "12000", "n/a", "20000", "-"]})
# Langkah 1: ubah yang bukan angka jadi NaN
df["harga"] = pd.to_numeric(df["harga"], errors="coerce")
print(df["harga"].tolist()) # [18000.0, 12000.0, nan, 20000.0, nan]
print(df["harga"].dtype) # float64 (NaN memaksa float)
# Langkah 2: putuskan, buang atau isi NaN
df["harga"] = df["harga"].fillna(0).astype(int)
print(df["harga"].tolist()) # [18000, 12000, 0, 20000, 0]Konversi Tanggal dengan to_datetime()
Tanggal hampir selalu butuh perlakuan khusus. pd.to_datetime() mengubah teks jadi tipe datetime64 yang bisa dioperasikan.
df = pd.DataFrame({"tanggal": ["2024-01-05", "2024-02-10", "05/03/2024"]})
df["tanggal"] = pd.to_datetime(df["tanggal"], dayfirst=True)
print(df["tanggal"].dtype) # datetime64[ns]
# Sekarang operasi tanggal jadi bisa
print(df["tanggal"].max()) # tanggal paling akhir
print((df["tanggal"].max() - df["tanggal"].min()).days) # selisih hariCatatan teknis:
errors="coerce"adalah sahabatmu saat konversi massal. Nilai yang gagal dikonversi jadiNaN(untuk angka) atauNaT(untuk tanggal), bukan error yang menghentikan program. Setelah itu kamu bisa memutuskan: buang dengandropna()atau isi denganfillna().
Jebakan Umum
SALAH, menjumlahkan kolom angka yang tipenya object:
# Jangan: sum() pada string menggabungkan teks!
df = pd.DataFrame({"total": ["10000", "20000", "30000"]})
print(df["total"].sum()) # '100002000030000' <- teks digabung!BENAR, konversi dulu baru hitung:
# Lakukan: pastikan numerik sebelum agregasi
df = pd.DataFrame({"total": ["10000", "20000", "30000"]})
df["total"] = pd.to_numeric(df["total"])
print(df["total"].sum()) # 60000SALAH, astype(int) pada kolom yang masih mengandung NaN:
# Jangan: NaN tidak bisa jadi integer biasa
s = pd.Series([1.0, 2.0, float("nan")])
s.astype(int) # ValueError: cannot convert float NaN to integerBENAR, tangani NaN dulu atau pakai Int64 (nullable):
# Lakukan: isi NaN dulu, atau pakai tipe integer nullable
s = pd.Series([1.0, 2.0, float("nan")])
print(s.fillna(0).astype(int).tolist()) # [1, 2, 0]
print(s.astype("Int64").tolist()) # [1, 2, <NA>] (NaN tetap terjaga)Tantangan
Perbaiki tipe data dataset kotor
Diberi DataFrame dengan kolom harga ["15000", "n/a", "20000"] dan kolom tanggal ["2024-01-01", "2024-01-02", "bukan tanggal"]. Konversi harga jadi numerik (gagal jadi NaN lalu isi 0 dan ubah ke int) dan tanggal jadi datetime (gagal jadi NaT). Cetak dtypes akhir.