Comment réparer dans Pandas : SettingWithCopyWarning



Un avertissement que vous pouvez rencontrer lors de l’utilisation de pandas est :

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

Cet avertissement apparaît lorsque les pandas rencontrent quelque chose appelé affectation de chaîne – la combinaison du chaînage et de l’affectation en une seule étape.

Il est important de noter qu’il s’agit simplement d’un avertissement et non d’une erreur. Votre code continuera à s’exécuter, mais les résultats risquent de ne pas toujours correspondre à ce que vous pensiez.

Le moyen le plus simple de supprimer cet avertissement consiste à utiliser le morceau de code suivant :

pd.options.mode.chained_assignment = None

L’exemple suivant montre comment répondre à cet avertissement dans la pratique.

Comment reproduire l’avertissement

Supposons que nous créions le DataFrame pandas suivant :

import pandas as pd

#create DataFrame
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

Supposons maintenant que nous créions un nouveau DataFrame qui contient uniquement la colonne « A » du DataFrame d’origine et que nous divisons chaque valeur de la colonne « A » par 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

Nous recevons le message SettingWithCopyWarning car nous définissons de nouvelles valeurs pour la colonne « A » sur une « tranche » du DataFrame d’origine.

Cependant, si nous regardons le nouveau DataFrame que nous avons créé, nous verrons que chaque valeur a en fait été divisée avec succès par 2 :

#view new DataFrame
df2

     A
0 12.5
1 6.0
2 7.5
3 7.0
4 9.5
5 11.5
6 12.5
7 14.5

Même si nous avons reçu un message d’avertissement, les pandas ont quand même fait ce que nous pensions qu’ils feraient.

Comment éviter l’avertissement

Pour éviter cet avertissement, il est recommandé d’utiliser la syntaxe .loc[row indexer, col indexer] comme suit :

#define new DataFrame
df2 = df.loc[:, ['A']]

#divide each value in column 'A' by 2
df2['A'] = df['A'] / 2

#view result
df2

     A
0 12.5
1 6.0
2 7.5
3 7.0
4 9.5
5 11.5
6 12.5
7 14.5

Le nouveau DataFrame contient toutes les valeurs de la colonne « A » dans le DataFrame d’origine, divisées par deux, et aucun message d’avertissement n’apparaît.

Si nous souhaitons empêcher l’affichage du message d’avertissement, nous pouvons utiliser le morceau de code suivant :

#prevent SettingWithCopyWarning message from appearing
pd.options.mode.chained_assignment = None

Pour une explication détaillée des raisons pour lesquelles l’affectation en chaîne doit être évitée, reportez-vous à la documentation pandas en ligne .

Ressources additionnelles

Comment réparer : aucun module nommé pandas
Comment réparer : aucun module nommé numpy
Comment réparer : les colonnes se chevauchent mais aucun suffixe n’est spécifié

Ajouter un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *