Ketika memilih sub dataframe dari dataframe induk, saya perhatikan bahwa beberapa programmer membuat salinan bingkai data menggunakan .copy()
metode ini. Sebagai contoh,
X = my_dataframe[features_list].copy()
... bukannya adil
X = my_dataframe[features_list]
Mengapa mereka membuat salinan bingkai data? Apa yang akan terjadi jika saya tidak membuat salinan?
python
pandas
chained-assignment
Elizabeth Susan Joseph
sumber
sumber
Jawaban:
Ini memperluas jawaban Paulus. Di Pandas, pengindeksan DataFrame mengembalikan referensi ke DataFrame awal. Dengan demikian, mengubah subset akan mengubah DataFrame awal. Dengan demikian, Anda ingin menggunakan salinan jika Anda ingin memastikan bahwa DataFrame awal tidak boleh berubah. Pertimbangkan kode berikut:
Anda akan mendapatkan:
Sebaliknya, berikut ini tidak berubah:
sumber
Karena jika Anda tidak membuat salinan maka indeks masih dapat dimanipulasi di tempat lain bahkan jika Anda menetapkan dataFrame ke nama yang berbeda.
Sebagai contoh:
func1 dapat memodifikasi df dengan memodifikasi df2, jadi untuk menghindari itu:
sumber
, both variables reference the same DataFrame instance. So any changes made to
df2 = df df` ataudf2
akan dibuat ke instance objek yang sama. Sedangkan dalamdf2 = df.copy()
instance objek kedua dibuat, salinan yang pertama, tapi sekarangdf
dandf2
referensi ke instance objek yang berbeda dan perubahan apa pun akan dilakukan pada instance DataFrame masing-masing.Perlu disebutkan bahwa pengembalian salinan atau tampilan tergantung pada jenis pengindeksan.
Dokumentasi panda mengatakan:
sumber
Tujuan utama adalah untuk menghindari pengindeksan berantai dan menghilangkan
SettingWithCopyWarning
.Di sini pengindeksan berantai adalah sesuatu seperti
dfc['A'][0] = 111
Dokumen itu mengatakan pengindeksan berantai harus dihindari dalam Mengembalikan tampilan versus salinan . Berikut adalah contoh yang sedikit dimodifikasi dari dokumen itu:
Di sini
aColumn
adalah tampilan dan bukan salinan dari DataFrame asli, jadi memodifikasiaColumn
akan menyebabkan yang aslidfc
juga dimodifikasi. Selanjutnya, jika kita mengindeks baris pertama:Kali ini
zero_row
adalah salinan, jadi yang aslidfc
tidak diubah.Dari dua contoh di atas, kami melihat ambigu apakah Anda ingin mengubah DataFrame asli atau tidak. Ini sangat berbahaya jika Anda menulis sesuatu seperti berikut:
Kali ini tidak berhasil sama sekali. Di sini kami ingin mengubah
dfc
, tetapi kami benar-benar mengubah nilai menengahdfc.loc[0]
yang merupakan salinan dan segera dibuang. Sangat sulit untuk memprediksi apakah nilai antara sukadfc.loc[0]
atau tidakdfc['A']
adalah tampilan atau salinan, jadi tidak dijamin apakah DataFrame asli akan diperbarui atau tidak. Itu sebabnya pengindeksan berantai harus dihindari, dan panda menghasilkanSettingWithCopyWarning
pembaruan pengindeksan berantai seperti ini.Sekarang adalah penggunaan
.copy()
. Untuk menghilangkan peringatan, buat salinan untuk mengekspresikan niat Anda secara eksplisit:Karena Anda memodifikasi salinan, Anda tahu yang asli
dfc
tidak akan pernah berubah dan Anda tidak mengharapkannya untuk berubah. Harapan Anda cocok dengan perilaku, laluSettingWithCopyWarning
menghilang.Catatan, Jika Anda ingin memodifikasi DataFrame asli, dokumen menyarankan Anda menggunakan
loc
:sumber
Secara umum itu lebih aman untuk bekerja pada salinan daripada pada frame data asli, kecuali ketika Anda tahu bahwa Anda tidak akan membutuhkan yang asli lagi dan ingin melanjutkan dengan versi yang dimanipulasi. Biasanya, Anda masih memiliki beberapa penggunaan untuk bingkai data asli untuk dibandingkan dengan versi yang dimanipulasi, dll. Oleh karena itu, kebanyakan orang bekerja pada salinan dan bergabung pada akhirnya.
sumber
Diasumsikan Anda memiliki kerangka data seperti di bawah ini
Ketika Anda ingin membuat yang lain
df2
identik dengandf1
, tanpacopy
Dan ingin memodifikasi nilai df2 hanya seperti di bawah ini
Pada saat yang sama df1 diubah juga
Karena dua df sama
object
, kita dapat memeriksanya dengan menggunakanid
Jadi mereka sebagai objek yang sama dan satu perubahan yang lain akan melewati nilai yang sama juga.
Jika kita menambahkan
copy
, dan sekarangdf1
dandf2
dianggap berbedaobject
, jika kita melakukan perubahan yang sama ke salah satunya, yang lain tidak akan berubah.Baik untuk disebutkan, ketika Anda mengatur ulang kerangka data asli, aman untuk menambahkan salinan juga untuk menghindari
SettingWithCopyWarning
sumber