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ş