python - slicing - slice a dataframe pandas
Pandas: SettingWithCopyWarning (4)
--- problema resuelto para mi ---
Tuve un error de resolución cuando intenté convertir float -> int incluso si usé el comando ".loc". mi error fue que filtré mi marco de datos (con máscaras) antes de la operación para que la conversión se produjera solo en una pequeña parte del elemento / columna del marco de datos, el resultado fue una columna de tipo mixto que crea una confluencia. Resolví el problema convirtiendo el marco de datos antes de las máscaras (filtración de datos), espero que sirva de ayuda.
Esta pregunta ya tiene una respuesta aquí:
- ¿Cómo lidiar con SettingWithCopyWarning en Pandas? 11 respuestas
Me gustaría reemplazar los valores en un Pandas
DataFrame
más grande que un número arbitrario (100 en este caso) con NaN
(ya que los valores tan grandes son indicativos de un experimento fallido). Anteriormente he usado esto para reemplazar valores no deseados:
sve2_all[sve2_all['' Hgtot ng/l''] > 100] = np.nan
Sin embargo, tengo el siguiente error:
-c:3: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_index,col_indexer] = value instead
C:/Users/AppData/Local/Enthought/Canopy32/User/lib/site-packages/pandas/core/indexing.py:346: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_index,col_indexer] = value instead
self.obj[item] = s
Según esta pregunta de StackExchange , parece que a veces se puede ignorar esta advertencia, pero no puedo seguir la discusión lo suficientemente bien como para saber si esto se aplica a mi situación. ¿La advertencia básicamente me está haciendo saber que sobrescribiré algunos de los valores en mi DataFrame
?
Edit: Por lo que puedo decir, todo se comportó como debería. Como seguimiento, ¿mi método de reemplazo de valores no es estándar? ¿Hay una mejor manera de reemplazar los valores?
Como lo sugieren otros usuarios, puedes probar:
myindex = sve2_all['' Hgtot ng/l''] > 100
sve2_all.loc[myindex, ''yourcolumn''] = np.nan
Tenga en cuenta que si tiene problemas para crear tablas dinámicas (palabra clave de la row
pivot_table no compatible con pandas 0.16.0 #417
), debe usar la nueva sintaxis de índice y columnas en lugar de filas y columnas. https://github.com/yhat/ggplot/issues/417
Ver también:
http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy
Como se sugiere en el mensaje de error, debe usar loc para hacer esto:
sve2_all.loc[sve2_all[''Hgtot ng/l''] > 100] = np.nan
La advertencia está aquí para detener la modificación de una copia (aquí sve2_all[sve2_all['' Hgtot ng/l''] > 100]
es potencialmente una copia, y si es así, cualquier modificación no cambiaría el marco original. Podría ser que funciona correctamente en algunos casos, pero los pandas no pueden garantizar que funcionará en todos los casos ... úselo bajo su propio riesgo (considérese advertido!;)).
Recibí esta advertencia al intentar restablecer el contenido de todo un DataFrame pero no pude resolverlo usando loc
o iloc
:
df.loc[:, :] = new_values # SettingWithCopyWarning
df.iloc[:, :] = new_values # SettingWithCopyWarning
Pero resolver el ndarray contenido como datos resolvió el problema:
df.values[:, :] = new_values # no warnings and desired behavior