Come risolvere il problema in panda: settingwithcopywarning


Un avvertimento che potresti incontrare quando usi i panda è:

 SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame.

Questo avvertimento appare quando i panda incontrano qualcosa chiamato assegnazione a catena – la combinazione di concatenamento e assegnazione in un unico passaggio.

È importante notare che questo è solo un avviso e non un errore. Il tuo codice continuerà a essere eseguito, ma i risultati potrebbero non essere sempre quelli previsti.

Il modo più semplice per eliminare questo avviso è utilizzare la seguente parte di codice:

 p.d. options . fashion . chained_assignment = None

L’esempio seguente mostra come rispondere concretamente a questo avviso.

Come riprodurre l’avviso

Supponiamo di creare il seguente DataFrame panda:

 import pandas as pd

#createDataFrame
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

Supponiamo ora di creare un nuovo DataFrame che contenga solo la colonna “A” del DataFrame originale e di dividere ogni valore nella colonna “A” per 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

Riceviamo il messaggio SettingWithCopyWarning perché stiamo impostando nuovi valori per la colonna “A” su una “fetta” del DataFrame originale.

Tuttavia, se osserviamo il nuovo DataFrame che abbiamo creato, vedremo che ogni valore è stato effettivamente diviso con successo per 2:

 #view new DataFrame
df2

     HAS
0 12.5
1 6.0
2 7.5
3 7.0
4 9.5
5 11.5
6 12.5
7 14.5

Anche se abbiamo ricevuto un messaggio di avvertimento, i panda hanno comunque fatto quello che pensavamo avrebbero fatto.

Come evitare l’avviso

Per evitare questo avviso, si consiglia di utilizzare la sintassi .loc[row indexer, col indexer] come segue:

 #define new DataFrame
df2 = df. loc [:,[' A ']]

#divide each value in column 'A' by 2
df2[' A '] = df[' A '] / 2

#view result
df2

     HAS
0 12.5
1 6.0
2 7.5
3 7.0
4 9.5
5 11.5
6 12.5
7 14.5

Il nuovo DataFrame contiene tutti i valori della colonna “A” nel DataFrame originale, divisi per due, e non vengono visualizzati messaggi di avviso.

Se vogliamo evitare che venga visualizzato il messaggio di avviso, possiamo utilizzare il seguente pezzo di codice:

 #prevent SettingWithCopyWarning message from appearing
p.d. options . fashion . chained_assignment = None

Per una spiegazione dettagliata del motivo per cui l’assegnazione a catena dovrebbe essere evitata, fare riferimento alla documentazione online di Pandas .

Risorse addizionali

Come risolvere il problema: nessun modulo denominato Pandas
Come risolvere: nessun modulo denominato numpy
Come risolvere il problema: le colonne si sovrappongono ma non è specificato alcun suffisso

Aggiungi un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *