pandasdtypeMenengah5 mnt baca

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.

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

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

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

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

Catatan teknis: errors="coerce" adalah sahabatmu saat konversi massal. Nilai yang gagal dikonversi jadi NaN (untuk angka) atau NaT (untuk tanggal), bukan error yang menghentikan program. Setelah itu kamu bisa memutuskan: buang dengan dropna() atau isi dengan fillna().

Jebakan Umum

SALAH, menjumlahkan kolom angka yang tipenya object:

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

python
# Lakukan: pastikan numerik sebelum agregasi
df = pd.DataFrame({"total": ["10000", "20000", "30000"]})
df["total"] = pd.to_numeric(df["total"])
print(df["total"].sum())  # 60000

SALAH, astype(int) pada kolom yang masih mengandung NaN:

python
# 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 integer

BENAR, tangani NaN dulu atau pakai Int64 (nullable):

python
# 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.