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