Hoe op te lossen in panda's: settingwithcopywarning
Een waarschuwing die u kunt tegenkomen bij het gebruik van panda’s is:
SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame.
Deze waarschuwing verschijnt wanneer panda’s iets tegenkomen dat ketentoewijzing wordt genoemd: de combinatie van ketening en toewijzing in één stap.
Het is belangrijk op te merken dat dit slechts een waarschuwing is en geen fout. Uw code blijft actief, maar de resultaten zijn mogelijk niet altijd wat u had verwacht.
De eenvoudigste manier om deze waarschuwing te onderdrukken is door het volgende stukje code te gebruiken:
p.d. options . fashion . chained_assignment = None
Het volgende voorbeeld laat zien hoe u in de praktijk op deze waarschuwing kunt reageren.
Hoe de waarschuwing te reproduceren
Stel dat we de volgende panda’s DataFrame maken:
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
Stel nu dat we een nieuw DataFrame maken dat alleen kolom „A“ uit het oorspronkelijke DataFrame bevat en elke waarde in kolom „A“ delen door 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
We ontvangen het SettingWithCopyWarning- bericht omdat we nieuwe waarden instellen voor kolom „A“ op een „segment“ van het originele DataFrame.
Als we echter naar het nieuwe DataFrame kijken dat we hebben gemaakt, zullen we zien dat elke waarde feitelijk met succes door 2 is gedeeld:
#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
Ondanks dat we een waarschuwingsbericht kregen, deden de panda’s nog steeds wat we dachten dat ze zouden doen.
Hoe de waarschuwing te vermijden
Om deze waarschuwing te vermijden, wordt aanbevolen om de syntaxis .loc[row indexer, col indexer] als volgt te gebruiken:
#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
Het nieuwe DataFrame bevat alle waarden uit kolom ‘A’ in het originele DataFrame, gedeeld door twee, en er verschijnen geen waarschuwingsberichten.
Als we willen voorkomen dat het waarschuwingsbericht wordt weergegeven, kunnen we het volgende stukje code gebruiken:
#prevent SettingWithCopyWarning message from appearing p.d. options . fashion . chained_assignment = None
Voor een gedetailleerde uitleg waarom ketentoewijzing moet worden vermeden, raadpleegt u de online panda-documentatie .
Aanvullende bronnen
Oplossing: Geen module met de naam pandas
Oplossing: geen module met de naam numpy
Oplossing: Kolommen overlappen elkaar, maar er is geen achtervoegsel opgegeven