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