the slicing see index data columns caveats and python python-2.7 pandas chained-assignment

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í:

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:

Pandas SettingWithCopyWarning

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