Maison >développement back-end >Tutoriel Python >Pourquoi le SettingWithCopyWarning persiste-t-il avec l'indexation .loc ?
SettingWithCopyWarning persiste avec l'indexation .loc
Lors de l'utilisation de .loc[row_indexer,col_indexer] = valeur pour la manipulation de données, vous pouvez toujours rencontrer le SettingWithCopyWarning. Cela est généralement dû à la copie du dataframe sous-jacent avant d'appliquer les modifications.
Reproduction d'erreur étape par étape
Considérez le dataframe df suivant :
<code class="python">import pandas as pd d = {'col1': [1, 2, 3, 4], 'col2': [3, 4, 5, 6]} df = pd.DataFrame(data=d)</code>
Initialement, la modification d'une colonne à l'aide de .loc ne déclenche aucun avertissement :
<code class="python">df['new_column'] = None df.loc[0, 'new_column'] = 100</code>
Cependant, si df est filtré pour créer un nouveau dataframe new_df, les modifications ultérieures à l'aide de .loc peuvent entraîner l'avertissement :
<code class="python">new_df = df.loc[df.col1 > 2] new_df.loc[2, 'new_column'] = 100</code>
Cela se produit car new_df est une vue ou une tranche de df et les modifications appliquées à new_df ne sont pas propagées à df.
Solution
Pour éliminer l'avertissement, il est nécessaire de faire une copie de df avant d'appliquer le filtre :
<code class="python">new_df_copy = df.loc[df.col1 > 2].copy() new_df_copy.loc[2, 'new_column'] = 100</code>
En utilisant .copy(), une nouvelle trame de données est créée, indépendante de df, permettant les modifications à new_df_copy sans modifier df.
Évitement des convert_objects
Le SettingWithCopyWarning peut également être déclenché par la fonction convert_objects. Pour éviter cela, utilisez .astype(str) avant d'appeler convert_objects :
<code class="python">value1['Total Population'] = value1['Total Population'].astype(str).convert_objects(convert_numeric=True)</code>
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!