Personnaliser les préférences

Nous utilisons des cookies pour vous aider à naviguer efficacement et à exécuter certaines fonctions. Vous trouverez ci-dessous des informations détaillées sur tous les cookies sous chaque catégorie de consentement.

Les cookies classés comme « Nécessaires » sont stockés sur votre navigateur car ils sont essentiels pour activer les fonctionnalités de base du site.... 

Toujours actif

Necessary cookies are required to enable the basic features of this site, such as providing secure log-in or adjusting your consent preferences. These cookies do not store any personally identifiable data.

Aucun cookie à afficher.

Functional cookies help perform certain functionalities like sharing the content of the website on social media platforms, collecting feedback, and other third-party features.

Aucun cookie à afficher.

Analytical cookies are used to understand how visitors interact with the website. These cookies help provide information on metrics such as the number of visitors, bounce rate, traffic source, etc.

Aucun cookie à afficher.

Performance cookies are used to understand and analyze the key performance indexes of the website which helps in delivering a better user experience for the visitors.

Aucun cookie à afficher.

Advertisement cookies are used to provide visitors with customized advertisements based on the pages you visited previously and to analyze the effectiveness of the ad campaigns.

Aucun cookie à afficher.

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 *