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.
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)) 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.6Seleksi satu kolom dijalankan pada data yang sudah tersimpan. Perhatikan tipe hasilnya.
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))Series
0 21.5
1 21.8
2 22.0
Name: suhu_c, dtype: float64Hasilnya 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.
import pandas as pd
df = pd.read_csv("sensor_log.csv", parse_dates=["waktu"])
print(df[["suhu_c", "ruang"]].head(3)) suhu_c ruang
0 21.5 Ruang Arsip
1 21.8 Lab B
2 22.0 Ruang ArsipNama kolom yang tidak ada menghasilkan KeyError, dan pesannya menyebut nama yang gagal dicari. Jalankan blok berikut untuk melihat bentuk pesannya.
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))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.
import pandas as pd
df = pd.read_csv("sensor_log.csv", parse_dates=["waktu"])
df["count"] = 1
print(type(df.count).__name__)methodMeskipun 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.
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))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-accessMenambah 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.
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)) 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.1Kaitan 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.
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])21.5
99.0Tabel 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.
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))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"]mengembalikanSeriessatu kolom, sedangkandf[["a", "b"]]mengembalikanDataFramedengan urutan kolom mengikuti list.- Akses atribut
df.kolomhanya untuk nama yang sah sebagai identifier dan tidak bertabrakan dengan metode, serta tidak dapat dipakai membuat kolom. - Kolom baru ditambahkan dengan
df["nama"] = nilaisebagai satu-satunya bentuk yang sah. - Copy-on-Write membuat setiap
Serieshasil seleksi bersifat seperti salinan, sehingga perubahan padanya tidak pernah mengubahDataFrameasal.
Referensi#
- Indexing and selecting data — pandas User Guide — panduan resmi seleksi kolom, batas akses atribut, dan aturan penambahan kolom.
- 10 minutes to pandas — pandas User Guide — pengenalan singkat seleksi kolom dan pembuatan kolom baru pada DataFrame.