Seleksi Kolom

Seleksi kolom dengan kurung siku, batas akses atribut, dan pemilihan banyak kolom.

Daftar isi

Modul seleksi dimulai dari kolom karena hampir semua pekerjaan pandas dimulai dari mengambil satu atau beberapa kolom dari DataFrame. Topik ini membahas seleksi kolom pada dataset log sensor suhu dan kelembapan tiga ruangan yang dipakai di seluruh jalur, mulai dari kurung siku satu kolom, list banyak kolom, akses atribut, sampai penambahan kolom baru. Setelah membaca, pemilihan kolom dapat dilakukan dengan bentuk sintaks yang tepat dan kolom baru dapat ditambahkan tanpa menyentuh salinan data yang salah.

Satu kolom menghasilkan Series#

Kurung siku dengan satu nama kolom mengembalikan sebuah Series, yaitu struktur satu dimensi yang memuat nilai dan label untuk setiap nilainya. DataFrame tersusun dari kolom-kolom semacam ini, sehingga hasil seleksi satu kolom mewarisi sifat Series: memiliki name, memiliki satu tipe data, dan dapat dihitung langsung. Dataset jalur ini dibuat oleh generator deterministik dengan seed tetap, sehingga setiap blok kode menghasilkan data yang persis sama. Blok pertama membangun dataset itu lalu menyimpannya sebagai sensor_log.csv agar blok-blok berikutnya cukup membaca berkas tersebut dari folder yang sama.

python Membangun dataset log sensor dan menyimpannya ke CSV
import numpy as np
import pandas as pd

rng = np.random.default_rng(42)
n = 96
df = pd.DataFrame({
    "waktu": pd.date_range("2026-01-05 07:00", periods=n, freq="15min"),
    "ruang": rng.choice(["Lab A", "Lab B", "Ruang Arsip"], n, p=[0.4, 0.35, 0.25]),
    "suhu_c": np.round(rng.normal(24, 1.5, n), 1),
    "lembap_pct": np.round(rng.normal(60, 5, n), 1),
    "status_sensor": rng.choice(["normal", "kalibrasi", "rusak"], n, p=[0.85, 0.10, 0.05]),
})
df.to_csv("sensor_log.csv", index=False)  # disimpan agar blok berikutnya cukup membaca berkas ini
print(df[["waktu", "ruang", "suhu_c"]].head(5))
text Keluaran
                waktu        ruang  suhu_c
0 2026-01-05 07:00:00  Ruang Arsip    21.5
1 2026-01-05 07:15:00        Lab B    21.8
2 2026-01-05 07:30:00  Ruang Arsip    22.0
3 2026-01-05 07:45:00        Lab B    22.5
4 2026-01-05 08:00:00        Lab A    24.6

Seleksi satu kolom dijalankan pada data yang sudah tersimpan. Perhatikan tipe hasilnya.

python Mengambil satu kolom sebagai Series
import pandas as pd

df = pd.read_csv("sensor_log.csv", parse_dates=["waktu"])
suhu = df["suhu_c"]
print(type(suhu).__name__)
print(suhu.head(3))
text Keluaran
Series
0    21.5
1    21.8
2    22.0
Name: suhu_c, dtype: float64

Hasilnya adalah Series bertipe float64 bernama suhu_c, bukan tabel. Kolom teks seperti ruang dan status_sensor pada pandas 3.x berdtype str, yaitu dtype string khusus yang diperkenalkan sebagai bawaan pada versi ini. Karena satu kolom selalu satu tipe, operasi per kolom seperti suhu.mean() atau ruang.str.upper() dapat dipanggil tanpa konversi tambahan.

Banyak kolom dengan list#

Kurung siku yang diisi list nama kolom mengembalikan DataFrame, bukan Series. Inilah perbedaan bentuk hasil yang paling sering keliru dibaca: satu nama kolom menghasilkan satu dimensi, sedangkan list nama kolom menghasilkan tabel dua dimensi. Urutan kolom pada hasil mengikuti urutan list, sehingga list yang sama dapat dipakai untuk menata ulang urutan tampilan kolom tanpa mengubah data asalnya.

python Mengambil dua kolom dengan urutan yang ditentukan list
import pandas as pd

df = pd.read_csv("sensor_log.csv", parse_dates=["waktu"])
print(df[["suhu_c", "ruang"]].head(3))
text Keluaran
   suhu_c        ruang
0    21.5  Ruang Arsip
1    21.8        Lab B
2    22.0  Ruang Arsip

Nama kolom yang tidak ada menghasilkan KeyError, dan pesannya menyebut nama yang gagal dicari. Jalankan blok berikut untuk melihat bentuk pesannya.

python KeyError ketika nama kolom tidak ada
import pandas as pd

df = pd.read_csv("sensor_log.csv", parse_dates=["waktu"])
try:
    df[["suhu_c", "tekanan_hpa"]]
except KeyError as e:
    print(type(e).__name__, str(e))
text Keluaran
KeyError "['tekanan_hpa'] not in index"

Pesan KeyError berisi daftar nama yang tidak ditemukan, sehingga kesalahan ejaan nama kolom langsung terlihat. Periksa nama yang tersedia dengan df.columns sebelum menulis list seleksi bila nama kolomnya panjang atau berasal dari berkas eksternal.

Batas akses atribut#

Kolom juga dapat diambil sebagai atribut melalui df.suhu_c, dan hasilnya sama dengan df["suhu_c"]. Bentuk ini lebih pendek dan sah pada REPL atau notebook untuk eksplorasi cepat, tetapi panduan resmi pandas menyarankan kurung siku karena akses atribut memiliki batasan yang tidak dimiliki kurung siku. Tiga batasnya perlu dihafal: nama kolom harus sah sebagai identifier Python, nama yang bertabrakan dengan atribut atau metode DataFrame tidak dapat diambil, dan kolom baru tidak dapat dibuat lewat atribut.

python Nama kolom yang bertabrakan dengan metode count
import pandas as pd

df = pd.read_csv("sensor_log.csv", parse_dates=["waktu"])
df["count"] = 1
print(type(df.count).__name__)
text Keluaran
method

Meskipun ada kolom bernama count, ekspresi df.count tetap mengembalikan metode count(), bukan kolom tersebut. Pencarian atribut Python memeriksa atribut kelas lebih dahulu, sehingga nama kolom yang bentrok dengan metode seperti count, sum, atau min tidak pernah terjangkau lewat titik. Satu-satunya jalan adalah kurung siku, dan di situlah kurung siku wajib digunakan.

Akses atribut juga tidak dapat digunakan untuk menambah kolom. Bila nilainya berbentuk list, pandas menolaknya dengan peringatan, dan kolomnya tetap tidak pernah muncul.

python Percobaan membuat kolom lewat atribut gagal
import warnings
import pandas as pd

df = pd.read_csv("sensor_log.csv", parse_dates=["waktu"])
with warnings.catch_warnings(record=True) as terekam:
    warnings.simplefilter("always")
    df.suhu_rata = [24.0] * len(df)
print("kolom suhu_rata ada?", "suhu_rata" in df.columns)
print("peringatan:", terekam[0].category.__name__)
print(str(terekam[0].message))
text Keluaran
kolom suhu_rata ada? False
peringatan: UserWarning
Pandas doesn't allow columns to be created via a new attribute name - see https://pandas.pydata.org/docs/dev/user_guide/indexing.html#attribute-access

Menambah kolom dengan kurung siku#

Penambahan kolom baru hanya sah melalui df["nama"] = nilai, baik nilainya berupa skalar, list sepanjang data, maupun Series hasil perhitungan kolom lain. Bentuk ini menambahkan kolom pada DataFrame yang dirujuk secara langsung, sehingga perubahannya pasti terjadi pada tabel yang dimaksud.

python Menambah kolom selisih kelembapan terhadap ambang 55 persen
import pandas as pd

df = pd.read_csv("sensor_log.csv", parse_dates=["waktu"])
df["selisih_lembap"] = (df["lembap_pct"] - 55).round(1)
print(df[["ruang", "lembap_pct", "selisih_lembap"]].head(3))
text Keluaran
         ruang  lembap_pct  selisih_lembap
0  Ruang Arsip        68.6            13.6
1        Lab B        59.1             4.1
2  Ruang Arsip        58.1             3.1

Kaitan dengan Copy-on-Write (CoW) perlu dipahami sejak di sini. Pada pandas 3.x CoW selalu aktif: sebuah Series yang diambil dari DataFrame berperilaku seperti salinan malas dari kolomnya, dan perubahan pada salinan itu tidak pernah merambat balik ke DataFrame asal.

python Perubahan pada Series hasil seleksi tidak menyentuh DataFrame
import pandas as pd

df = pd.read_csv("sensor_log.csv", parse_dates=["waktu"])
suhu = df["suhu_c"]
suhu.iloc[0] = 99.0
print(df["suhu_c"].iloc[0])
print(suhu.iloc[0])
text Keluaran
21.5
99.0

Tabel asal tetap menunjukkan 21.5, sedangkan Series salinannya menjadi 99.0, tanpa peringatan apa pun. Penulisan nilai yang benar dilakukan pada DataFrame-nya dengan df.loc[...] atau df["kolom"] = ..., dan pola itu dibahas tuntas pada topik Seleksi dengan loc.

Kesalahan umum#

Kesalahan pertama adalah mengira df["suhu_c"] menghasilkan DataFrame. Anggapan itu terasa karena sintaksnya mirip akses kamus, tetapi hasilnya Series satu dimensi, sehingga rangkaian seperti df["suhu_c"]["ruang"] tidak mungkin berhasil dan berakhir KeyError. Jalankan blok berikut untuk mengenali pesannya.

python Rangkaian seleksi satu kolom berakhir KeyError
import pandas as pd

df = pd.read_csv("sensor_log.csv", parse_dates=["waktu"])
try:
    df["suhu_c"]["ruang"]
except KeyError as e:
    print(type(e).__name__, str(e))
text Keluaran
KeyError 'ruang'

Perbaikannya adalah memilih banyak kolom dengan list, yaitu df[["suhu_c", "ruang"]], karena barulah bentuk itu menghasilkan DataFrame yang bisa diseleksi lagi. Kesalahan kedua adalah membuat kolom lewat atribut seperti df.suhu_rata = 24.0, yang hanya memunculkan UserWarning dan tidak pernah menambah kolom. Kesalahan ketiga adalah mengubah Series hasil seleksi sambil mengira tabel asal ikut berubah. Pada pandas 3.x perubahan itu nyaris hilang tanpa jejak karena CoW, sedangkan pada pandas 2.x pola yang sama dulu memunculkan SettingWithCopyWarning dengan teks yang berbeda tetapi maksud yang sama, yakni penulisan dilakukan pada salinan. Gunakan df.loc[baris, kolom] = nilai untuk penulisan nilai pada tabel asal.

Ringkasan#

  • df["kolom"] mengembalikan Series satu kolom, sedangkan df[["a", "b"]] mengembalikan DataFrame dengan urutan kolom mengikuti list.
  • Akses atribut df.kolom hanya untuk nama yang sah sebagai identifier dan tidak bertabrakan dengan metode, serta tidak dapat dipakai membuat kolom.
  • Kolom baru ditambahkan dengan df["nama"] = nilai sebagai satu-satunya bentuk yang sah.
  • Copy-on-Write membuat setiap Series hasil seleksi bersifat seperti salinan, sehingga perubahan padanya tidak pernah mengubah DataFrame asal.

Referensi#