Anatomi DataFrame

Kolom, index, dan blok data yang mendasari DataFrame beserta konsekuensinya.

Daftar isi

DataFrame adalah tabel dua dimensi yang tersusun atas kolom berlabel, index baris, dan blok data yang mendasarinya. Topik ini membedah ketiganya melalui atribut columns, index, dtypes, dan values, kemudian menarik konsekuensi aturan satu kolom satu dtype pada penyuntingan nilai. Setelah membacanya, struktur internal sebuah DataFrame dapat dibaca dan penugasan nilai dilakukan lewat jalur yang benar.

Kolom, index, dan dtypes sebagai kerangka tabel#

Atribut columns menyimpan label kolom, atribut index menyimpan label baris, dan atribut dtypes menyatakan tipe data setiap kolom. Ketiganya membentuk kerangka tabel, sedangkan isinya disimpan di balik kerangka itu. Contoh berikut membangun tabel kecil berisi pengukuran tiga ruangan, lalu membaca ketiga atributnya satu per satu.

python Contoh: kerangka sebuah DataFrame kecil
import pandas as pd

df = pd.DataFrame(
    {
        "ruang": ["Lab A", "Lab B", "Arsip"],
        "suhu_c": [24.1, 23.8, 21.5],
        "normal": [True, False, True],
    }
)
print(df.columns)
print(df.index)
print(df.dtypes)
text Keluaran
Index(['ruang', 'suhu_c', 'normal'], dtype='str')
RangeIndex(start=0, stop=3, step=1)
ruang         str
suhu_c    float64
normal       bool
dtype: object

Atribut columns mengembalikan objek Index yang memuat tiga label kolom, yaitu ruang, suhu_c, dan normal. Atribut index mengembalikan RangeIndex, yaitu label baris berurutan 0 sampai 2 yang terbentuk karena pembuatan tidak menyertakan argumen index. Tampilan RangeIndex(start=0, stop=3, step=1) menyatakan label dimulai dari 0, berhenti sebelum 3, dan bertambah satu per baris, sehingga banyaknya baris dapat dibaca dari nilai stop tanpa menghitung manual. Atribut dtypes menampilkan satu baris per kolom beserta tipe datanya, dan setiap kolom memang hanya membawa satu tipe. Tipe str pada kolom ruang adalah dtype string khusus yang digunakan pandas 3.x untuk seluruh kolom teks, sehingga kolom status, nama, atau kategori tampil dengan tanda yang sama.

Blok data values dan kenaikan dtype#

Atribut values mengembalikan isi tabel sebagai array NumPy dua dimensi, dan bila tipe kolomnya campur, seluruh array naik ke dtype yang paling umum. Kenaikan tipe (upcast) adalah konversi seluruh array ke satu dtype yang mampu memuat isi semua kolomnya. Perilaku ini terlihat langsung pada tabel tiga kolom di atas.

python Contoh: kenaikan dtype pada values
import pandas as pd

df = pd.DataFrame(
    {
        "ruang": ["Lab A", "Lab B", "Arsip"],
        "suhu_c": [24.1, 23.8, 21.5],
        "normal": [True, False, True],
    }
)
print(df.values)
print(df.values.dtype)
print(df[["suhu_c"]].values.dtype)
text Keluaran
[['Lab A' 24.1 True]
 ['Lab B' 23.8 False]
 ['Arsip' 21.5 True]]
object
float64

Keluaran pertama memperlihatkan array dua dimensi berisi tiga baris dan tiga kolom, dengan teks tampil dalam tanda kutip. Karena kolomnya bertipe teks, float64, dan bool, tidak ada satu dtype yang memuat semuanya, sehingga array naik menjadi object. Pemilihan kolom suhu_c saja mengembalikan array float64 murni tanpa kenaikan apa pun, seperti pada baris keluaran terakhir. Konsekuensinya, perhitungan numerik dilakukan pada kolom yang dipilih terlebih dahulu, bukan pada df.values, agar tipe data aslinya terjaga.

Akses lewat values tetap berguna ketika tabel diturunkan ke fungsi yang hanya menerima array NumPy, misalnya rutin perhitungan numerik yang tidak mengenal label. Keperluan lainnya adalah memeriksa isi tabel dalam bentuk paling mentah, karena array itu memuat nilai tanpa label kolom maupun label baris. Di luar dua keperluan itu, kolom yang dipilih lewat kurung siku ganda sudah memberikan array berdtype bersih untuk perhitungan, sehingga values jarang menjadi jalur utama dalam analisis sehari-hari.

Satu kolom satu dtype dan konsekuensinya#

Cara pandang yang tepat atas DataFrame adalah kumpulan kolom Series yang berbagi index sama, dan setiap kolom hanya menyimpan satu dtype. Pandangan ini menjelaskan sebagian besar perilaku penugasan nilai pada tabel, sebab menambah kolom berarti menambah Series berlabel baru, sedangkan mengisi kolom berarti menimpa isi Series itu. Blok berikut menguji kedua jalur penugasan yang berbeda hasilnya.

python Contoh: Copy-on-Write dan penugasan yang tepat
import pandas as pd

df = pd.DataFrame({"a": [1, 2, 3], "b": [4.0, 5.0, 6.0]})
s = df["a"]
s[0] = 99
print(df)
df.loc[0, "a"] = 99
print(df)
df["c"] = 7
print(df.dtypes)
print(df)
text Keluaran
   a    b
0  1  4.0
1  2  5.0
2  3  6.0
    a    b
0  99  4.0
1   2  5.0
2   3  6.0
a      int64
b    float64
c      int64
dtype: object
    a    b  c
0  99  4.0  7
1   2  5.0  7
2   3  6.0  7

Ekspresi df["a"] mengembalikan Series baru, dan sejak Copy-on-Write selalu aktif pada pandas 3.x, penyuntingan s[0] = 99 hanya mengubah Series itu sendiri. Tabel pertama membuktikan df tidak berubah sama sekali, dan tidak ada peringatan yang muncul. Penugasan lewat df.loc[0, "a"] = 99 adalah jalur yang benar, dan tabel kedua menunjukkan perubahan itu tersimpan. Penugasan df["c"] = 7 membuat kolom baru berdtype int64 yang nilainya disiarkan ke semua baris, sehingga kolom baru tetap bertipe tunggal tanpa konversi apa pun.

Kesalahan umum#

Kesalahan yang lazim pada level anatomi ini adalah mengisi kolom dengan data yang panjangnya tidak sama. Nilai yang ditugaskan ke satu kolom harus sama panjangnya dengan index, karena setiap label baris hanya boleh menerima satu nilai per kolom. Kode berikut menyenggol aturan itu dengan sengaja.

python Contoh: panjang nilai tidak sama dengan index
import pandas as pd

df = pd.DataFrame({"a": [1, 2, 3]})
try:
    df["x"] = [1, 2]
except ValueError as e:
    print(type(e).__name__)
    print(e)
text Keluaran
ValueError
Length of values (2) does not match length of index (3)

Pesan error menyebut panjang nilai dan panjang index secara eksplisit, sehingga penyebabnya mudah dilacak. Perbaikannya adalah melengkapi data sampai panjangnya sama atau mengisi celahnya dengan np.nan secara sadar. Kesalahan kedua yang berhubungan dengan topik ini adalah mengikuti tutorial lama yang mengubah nilai lewat Series hasil pengambilan kolom. Pada pandas 3.x pola itu tidak berdampak dan tidak memberi tanda apa pun, sehingga perubahan yang diharapkan hilang tanpa suara, dan jalur df.loc atau df["kolom"] = selalu menjadi jawabannya.

Ringkasan#

  • Atribut columns, index, dan dtypes memaparkan label kolom, label baris, dan tipe data per kolom, dengan kolom teks bertipe str pada pandas 3.x.
  • Atribut values mengembalikan array NumPy dua dimensi, dan dtype campur naik menjadi object sehingga perhitungan dilakukan per kolom.
  • DataFrame dipandang sebagai kumpulan kolom Series berbagi index, dan penugasan df["kolom"] = menambah atau mengisi satu kolom bertipe tunggal.
  • Copy-on-Write membuat penyuntingan pada Series hasil pengambilan kolom tidak berdampak ke DataFrame aslinya, sehingga perubahan ditulis lewat df.loc atau df["kolom"] =.

Referensi#