pandas-api-stability menyinggung perubahan perilaku besar antar versi, dan bab resmi pandas menaruh satu perubahan di tempat terpisah: Copy-on-Write, atau CoW. Sejak pandas 3.0, aturan ini selalu aktif dan tidak bisa dimatikan lagi: setiap hasil indexing atau method yang mengembalikan DataFrame baru berperilaku seperti salinan, bukan jendela (view) ke data asal. Konsekuensinya luas — chained assignment yang dulu berfungsi setengah hati kini berhenti bekerja sepenuhnya, dan SettingWithCopyWarning yang ikonik dihapus karena tidak ada lagi salinan samar. Chapter ini membahas aturan CoW, pola penulisan yang benar, dan manfaatnya.

Aturan Dasar CoW #

Contoh pertama menunjukkan aturannya secara langsung: subset = df["a"] menghasilkan objek yang berperilaku seperti salinan, sehingga perubahan pada subset tidak terlihat di df. Pada pandas lama, hasil kolom itu bisa jadi view — perubahan kadang merambat, kadang tidak, tergantung jalur memori. Dengan CoW, hasilnya pasti: df tetap [1, 2, 3] apa pun yang dilakukan pada subset. Untuk benar-benar mengubah data asal, penulisan harus terjadi pada DataFrame asal itu sendiri dalam satu panggilan, seperti df.loc[kondisi, "kolom"] = nilai.

python
import warnings

import pandas as pd

df = pd.DataFrame({"a": [1, 2, 3], "b": [10, 20, 30]})

# CoW: hasil indexing berperilaku seperti salinan
subset = df["a"]
subset.iloc[0] = 999
print("df tetap:", df["a"].tolist())

# pandas 3.0 melaporkan chained assignment sebagai ChainedAssignmentError
with warnings.catch_warnings(record=True) as terekam:
    warnings.simplefilter("always")
    df["a"][0] = 999
print("warning yang muncul:", [w.category.__name__ for w in terekam])

# penulisan yang benar: satu panggilan loc pada DataFrame asal
df.loc[df["a"] == 2, "a"] = 22
print("setelah loc:", df["a"].tolist())

# copy() tetap menghasilkan salinan mandiri
salin = df.copy()
salin.loc[0, "a"] = -1
print("df:", df["a"].tolist(), "| salin:", salin["a"].tolist())

Output yang Dihasilkan:

text
df tetap: [1, 2, 3]
warning yang muncul: ['ChainedAssignmentError']
setelah loc: [1, 22, 3]
df: [1, 22, 3] | salin: [-1, 22, 3]

Mari kita telaah baris-baris kuncinya:

  1. Baris 8-10: subset.iloc[0] = 999 tidak menyentuh df; cetakan df["a"].tolist() tetap [1, 2, 3].
  2. Baris 13-17: chained assignment df["a"][0] = 999 memicu peringatan berkelas ChainedAssignmentError dan nilainya tidak berubah.
  3. Baris 20-21: df.loc[df["a"] == 2, "a"] = 22 adalah pola penulisan yang benar — satu panggilan, langsung pada df, dan nilainya berubah menjadi [1, 22, 3].
  4. Baris 24-26: df.copy() tetap menghasilkan salinan mandiri; salin berubah, df tidak.

Chained Assignment Tamat #

Pola df["a"][0] = 999 pernah berjalan dengan bantuan SettingWithCopyWarning yang memperingatkan ambiguitasnya. Di era CoW, pandas 3.0 melempar ChainedAssignmentError dalam bentuk peringatan dan membiarkan operasinya sebagai no-op: nilai tidak pernah masuk. Tidak ada lagi dua kemungkinan hasil; hanya satu pola yang benar, yaitu loc atau at yang diakses sekali pada DataFrame asal. Bila mengganti pola lama, carilah rantai seperti df["a"][mask] = ... atau df[mask]["a"] = ... di kode lama dan tuliskan ulang menjadi df.loc[mask, "a"] = ... — satu baris yang setara dan terverifikasi.

Manfaat di Balik Aturan #

CoW bukan sekadar pelarangan; aturan ini menghapus keraguan memori yang menjadi sumber bug klasik. Karena method seperti reset_index() atau seleksi kolom berperilaku seperti salinan, fungsi yang menerima DataFrame dan “memodifikasi” hasil kerjanya tidak pernah merusak data pemanggil tanpa sengaja. pandas juga jadi bisa menunda salinan sungguhan: bila df2 = df.reset_index() tidak pernah diubah, tidak ada salinan data yang benar-benar dibuat, sehingga penggunaan memori turun. Sifat ini menjelaskan mengapa chapter copy-vs-view di section Performa menyebut CoW sebagai titik balik efisiensi, dan mengapa inplace=True kini hanya menghemat sedikit tanpa menjanjikan apa pun.

Aturan ini menjadi fondasi untuk chapter berikutnya yang membahas pengaturan opsi pandas secara menyeluruh — termasuk opsi display yang memengaruhi tampilan tabel dan opsi mode yang kini tinggal sedikit.

Dokumentasi resmi yang relevan: User Guide: Copy-on-Write (CoW) sebagai rujukan utama aturan ini, What’s new in pandas 3.0.0 yang merangkum perubahan chained assignment, dan pandas.DataFrame.copy untuk salinan eksplisit.