2016-06-15 16 views
11

Ho un dataframe panda: dati. ha colonne [ "nome", 'A', 'B']Modo corretto per impostare il valore su una fetta nei panda

Quello che voglio fare (ed opere) è:

d2 = data[data['name'] == 'fred'] #This gives me multiple rows 
d2['A'] = 0 

Questo imposterà la colonna A sulle righe Fred 0 . ho fatto anche:

indexes = d2.index 
data['A'][indexes] = 0 

Tuttavia, entrambi mi danno lo stesso avviso:

/Users/brianp/work/cyan/venv/lib/python2.7/site-packages/pandas/core/indexing.py:128: SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame 

See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy 

Come si fa panda vuoi che io faccia Thi S?

risposta

30

Questo è un avviso molto comune dai panda. Significa che stai scrivendo in una sezione copia, non i dati originali, quindi potrebbe non essere applicabile alle colonne originali a causa dell'incombente assegnazione concatenata. Si prega di leggere questo post. Ha una discussione dettagliata su questo SettingWithCopyWarning. Nel tuo caso penso che puoi provare

data.loc[data['name'] == 'fred', 'A'] = 0 
+1

stavo per pubblicare la stessa cosa. Un logico "one-liner" è meglio di linee inutili. – tnknepp

+0

Hai ragione. Grazie per avermi ricordato. –

+1

Non c'è un modo semplice per restituire un nuovo df con le colonne modificate e lasciare l'originale invariato? – user48956