Maison > développement back-end > Tutoriel Python > Pourquoi le SettingWithCopyWarning persiste-t-il avec l'indexation .loc ?

Pourquoi le SettingWithCopyWarning persiste-t-il avec l'indexation .loc ?

DDD
Libérer: 2024-10-28 08:03:02
original
906 Les gens l'ont consulté

Why Does the SettingWithCopyWarning Persist with .loc Indexing?

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>
Copier après la connexion

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>
Copier après la connexion

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>
Copier après la connexion

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>
Copier après la connexion

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>
Copier après la connexion

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!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal