Cara memperbaiki di pandas: settingwithcopywarning


Satu peringatan yang mungkin Anda temui saat menggunakan pandas adalah:

 SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame.

Peringatan ini muncul ketika panda menghadapi sesuatu yang disebut penugasan rantai – kombinasi rantai dan penugasan dalam satu langkah.

Penting untuk dicatat bahwa ini hanyalah peringatan dan bukan kesalahan. Kode Anda akan terus berjalan, namun hasilnya mungkin tidak selalu seperti yang Anda harapkan.

Cara termudah untuk menghilangkan peringatan ini adalah dengan menggunakan potongan kode berikut:

 p.d. options . fashion . chained_assignment = None

Contoh berikut menunjukkan bagaimana menanggapi peringatan ini dalam praktiknya.

Cara mereproduksi peringatan tersebut

Misalkan kita membuat DataFrame panda berikut:

 import pandas as pd

#createDataFrame
df = pd. DataFrame ({' A ': [25, 12, 15, 14, 19, 23, 25, 29],
                   ' B ': [5, 7, 7, 9, 12, 9, 9, 4],
                   ' C ': [11, 8, 10, 6, 6, 5, 9, 12]})

#view DataFrame
df

	A B C
0 25 5 11
1 12 7 8
2 15 7 10
3 14 9 6
4 19 12 6
5 23 9 5
6 25 9 9
7 29 4 12

Sekarang misalkan kita membuat DataFrame baru yang hanya berisi kolom “A” dari DataFrame asli dan membagi setiap nilai di kolom “A” dengan 2:

 #define new DataFrame
df2 = df[[' A ']]

#divide all values in column 'A' by 2
df2[' A '] = df[' A '] / 2

/srv/conda/envs/notebook/lib/python3.7/site-packages/ipykernel_launcher.py:2:
SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead

Kami menerima pesan SettingWithCopyWarning karena kami menetapkan nilai baru untuk kolom “A” pada “irisan” DataFrame asli.

Namun jika kita melihat DataFrame baru yang kita buat, kita akan melihat bahwa setiap nilai sebenarnya telah berhasil dibagi 2:

 #view new DataFrame
df2

     HAS
0 12.5
1 6.0
2 7.5
3 7.0
4 9.5
5 11.5
6 12.5
7 14.5

Meskipun kami menerima pesan peringatan, panda tetap melakukan apa yang kami pikir akan mereka lakukan.

Bagaimana cara menghindari peringatan tersebut

Untuk menghindari peringatan ini, disarankan untuk menggunakan sintaks .loc[row indexer, col indexer] sebagai berikut:

 #define new DataFrame
df2 = df. loc [:,[' A ']]

#divide each value in column 'A' by 2
df2[' A '] = df[' A '] / 2

#view result
df2

     HAS
0 12.5
1 6.0
2 7.5
3 7.0
4 9.5
5 11.5
6 12.5
7 14.5

DataFrame baru berisi semua nilai dari kolom “A” di DataFrame asli, dibagi dua, dan tidak ada pesan peringatan yang muncul.

Jika kita ingin mencegah pesan peringatan ditampilkan, kita dapat menggunakan potongan kode berikut:

 #prevent SettingWithCopyWarning message from appearing
p.d. options . fashion . chained_assignment = None

Untuk penjelasan mendetail tentang mengapa penetapan rantai harus dihindari, lihat dokumentasi pandas online .

Sumber daya tambahan

Cara memperbaikinya: Tidak ada modul bernama pandas
Cara memperbaikinya: tidak ada modul bernama numpy
Cara Memperbaiki: Kolom tumpang tindih tetapi tidak ada akhiran yang ditentukan

Tambahkan komentar

Alamat email Anda tidak akan dipublikasikan. Ruas yang wajib ditandai *