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
871 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!

source:php.cn
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