Pandalar'da nasıl düzeltilir: settingwithcopywarning


Pandaları kullanırken karşılaşabileceğiniz bir uyarı:

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

Bu uyarı, pandalar zincir atama adı verilen bir şeyle karşılaştığında ortaya çıkar; tek adımda zincirleme ve atamanın birleşimi.

Bunun bir hata değil, yalnızca bir uyarı olduğunu unutmamak önemlidir. Kodunuz çalışmaya devam edecektir ancak sonuçlar her zaman beklediğiniz gibi olmayabilir.

Bu uyarıyı bastırmanın en kolay yolu aşağıdaki kod parçasını kullanmaktır:

 p.d. options . fashion . chained_assignment = None

Aşağıdaki örnekte bu uyarıya pratikte nasıl yanıt verileceği gösterilmektedir.

Uyarı nasıl yeniden oluşturulur?

Aşağıdaki pandaları DataFrame oluşturduğumuzu varsayalım:

 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

Şimdi, orijinal DataFrame’den yalnızca “A” sütununu içeren yeni bir DataFrame oluşturduğumuzu ve “A” sütunundaki her değeri 2’ye böldüğümüzü varsayalım:

 #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

Orijinal DataFrame’in bir “diliminde” “A” sütunu için yeni değerler ayarladığımız için SettingWithCopyWarning mesajını alıyoruz.

Ancak oluşturduğumuz yeni DataFrame’e baktığımızda her değerin aslında 2’ye başarılı bir şekilde bölündüğünü göreceğiz:

 #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

Her ne kadar bir uyarı mesajı alsak da pandalar yine de yapacaklarını düşündüğümüz şeyi yaptılar.

Uyarı nasıl önlenir

Bu uyarıyı önlemek için .loc[row indexer, col indexer] sözdiziminin aşağıdaki gibi kullanılması önerilir:

 #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

Yeni DataFrame, orijinal DataFrame’deki “A” sütunundaki tüm değerleri ikiye bölünmüş olarak içerir ve hiçbir uyarı mesajı görünmez.

Uyarı mesajının görüntülenmesini engellemek istiyorsak aşağıdaki kod parçasını kullanabiliriz:

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

Zincir atamadan neden kaçınılması gerektiğine ilişkin ayrıntılı bir açıklama için çevrimiçi pandalar belgelerine bakın.

Ek kaynaklar

Nasıl düzeltilir? Pandalar adında modül yok
Nasıl düzeltilir: numpy adında modül yok
Nasıl düzeltilir? Sütunlar çakışıyor ancak son ek belirtilmemiş

Yorum ekle

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir