Jak naprawić w pandach: settingwithcopywarning


Jedno ostrzeżenie, które możesz napotkać podczas korzystania z pand, to:

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

To ostrzeżenie pojawia się, gdy pandy napotykają coś, co nazywa się przypisywaniem łańcuchowym – połączeniem łączenia i przypisywania w jednym kroku.

Należy pamiętać, że jest to jedynie ostrzeżenie , a nie błąd. Twój kod będzie nadal działał, ale wyniki nie zawsze będą zgodne z oczekiwaniami.

Najprostszym sposobem na pominięcie tego ostrzeżenia jest użycie następującego fragmentu kodu:

 p.d. options . fashion . chained_assignment = None

Poniższy przykład pokazuje, jak w praktyce zareagować na to ostrzeżenie.

Jak odtworzyć ostrzeżenie

Załóżmy, że tworzymy następującą ramkę danych pandy:

 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

Załóżmy teraz, że tworzymy nową ramkę DataFrame zawierającą tylko kolumnę „A” z oryginalnej ramki DataFrame i dzielimy każdą wartość w kolumnie „A” przez 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

Otrzymujemy komunikat SettingWithCopyWarning , ponieważ ustawiamy nowe wartości dla kolumny „A” na „wycinku” oryginalnej DataFrame.

Jeśli jednak spojrzymy na nową utworzoną przez nas ramkę DataFrame, zobaczymy, że każda wartość została faktycznie pomyślnie podzielona przez 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

Mimo że otrzymaliśmy ostrzeżenie, pandy nadal zrobiły to, co myśleliśmy, że zrobią.

Jak uniknąć ostrzeżenia

Aby uniknąć tego ostrzeżenia, zaleca się użycie składni .loc[indeksator wierszy, indeksator col] w następujący sposób:

 #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

Nowa DataFrame zawiera wszystkie wartości z kolumny „A” w oryginalnej DataFrame, podzielone przez dwa i nie pojawiają się żadne komunikaty ostrzegawcze.

Jeśli chcemy zapobiec wyświetlaniu komunikatu ostrzegawczego, możemy użyć następującego fragmentu kodu:

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

Szczegółowe wyjaśnienie, dlaczego należy unikać przypisywania łańcuchów, można znaleźć w dokumentacji pand dostępnej online .

Dodatkowe zasoby

Jak naprawić: brak modułu o nazwie pandas
Jak naprawić: brak modułu o nazwie numpy
Jak naprawić: Kolumny nakładają się, ale nie określono żadnego sufiksu

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *