Dans les pandas python SettingWithCopyWarning Une valeur tente d'être définie sur une copie d'une tranche d'un DataFrame. Essayez d'utiliser .loc [row_indexer, col_indexer] = value à la place

Objectif

Empêchez les avertissements suivants d'apparaître! (Le code qui donne cet avertissement est indiqué ci-dessous)

aa.py:5: 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

See the the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy
  d['col3']= d['col2'] * 3
   col1  col2  col3
0     1     2     6
2     1     2     6

Pour le moment, jetez un œil au lien écrit

http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy

dfmi.loc[:,('one','second')] = value
# becomes
dfmi.loc.__setitem__((slice(None), ('one', 'second')), value)

Il est écrit.

Code en question

aa.py


import pandas as pd

data = pd.DataFrame([[1,2],[2,3],[1,2],[2,3]], columns=['col1','col2'])
d = data[data['col1'] == 1]
d['col3']= d['col2'] * 3
print(d)

Si vous faites cela, vous obtiendrez l'avertissement ci-dessus.

Le problème réside dans la ligne suivante.

d = data[data['col1'] == 1]

S'il s'agit de «d = data», l'avertissement ci-dessus n'est pas disponible.

Cause et solution 1

Puisque les données ont des valeurs autres que col1 == 1, si vous essayez d'ajouter une nouvelle colonne au DF qui a été découpée par col1 == 1, ce sera étrange, alors faites-en une copie et seulement col1 == 1 à l'avance Faites juste un DF.

modifié


d = data[data['aa'] == 2].copy()

Cause et solution 2

Utilisez .loc comme pris en charge dans le lien ci-dessus et mettez à jour uniquement la partie correspondante.

modifié


#Mettez Value (côté droit) dans col3 (nouvelle colonne) bien que col1 remplisse la condition de 1.
data.loc[data['col1'] == 1, 'col3'] = data['col2'] * 3
#Extraire uniquement la partie où col1 est 1 à partir des données
d = data[data['col1'] == 1]
print('data:\n %s' % data)
print('d:\n%s' % d)

résultat


data:
    col1  col2  col3
0     1     2     6
1     2     3   NaN
2     1     2     6
3     2     3   NaN
d:
   col1  col2  col3
0     1     2     6
2     1     2     6

Recommended Posts

Dans les pandas python SettingWithCopyWarning Une valeur tente d'être définie sur une copie d'une tranche d'un DataFrame. Essayez d'utiliser .loc [row_indexer, col_indexer] = value à la place
Exemples et contre-mesures pour "Une valeur tente d'être définie sur une copie d'une tranche d'une trame de données." Avertissement chez les pandas
Comment obtenir la valeur du magasin de paramètres dans lambda (en utilisant python)
[Python] [Word] [python-docx] Essayez de créer un modèle de phrase de mot en Python en utilisant python-docx
Comment savoir s'il y a une valeur dans "quelque part" de pandas DataFrame
Comment créer une instance d'une classe particulière à partir de dict en utilisant __new__ () en python
Conversion de Pandas DataFrame en System.Data.DataTable à l'aide de Python pour .NET
Comment découper un bloc de plusieurs tableaux à partir d'un multiple en Python
Une raison simple pour laquelle la valeur de retour de round (2.675,2) est de 2,67 en python (elle devrait être de 2,68 en réalité ...)
Essayez d'obtenir la liste des fils du bulletin d'information (je n'aime pas) avec Python.
Comment trouver l'adresse mémoire de la valeur de la trame de données Pandas
Essayez de vous connecter automatiquement à Netflix en utilisant python sur votre PC
[Python] Qu'est-ce qu'un argument formel? Comment définir la valeur initiale
Un mémorandum parce que j'ai trébuché en essayant d'utiliser MeCab avec Python
Essayez de résoudre un problème défini de mathématiques au lycée avec Python
Utilisez Ruby et Python pour trouver la probabilité qu'une carte avec un nombre naturel de 1 à 100 soit un multiple de 3 et non un multiple de 5.