name - python pandas select rows
Pandas SettingWithCopyWarning (2)
Python 3.4 y Pandas 0.15.0
df es un marco de datos y col1 es una columna. Con el código a continuación, estoy verificando la presencia del valor 10 y reemplazando dichos valores con 1000.
df.col1[df.col1 == 10] = 1000
Aquí hay otro ejemplo. Esta vez, estoy cambiando los valores en col2 según el índice.
df.col2[df.index == 151] = 500
Ambos producen la siguiente advertencia:
-c:1: SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame
See the the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy
Finalmente,
cols = [''col1'', ''col2'', ''col3'']
df[cols] = df[cols].applymap(some_function)
Esto produce una advertencia similar, con una sugerencia adicional:
Try using .loc[row_indexer,col_indexer] = value instead
No estoy seguro de entender la discusión señalada en las advertencias. ¿Cuál sería una mejor manera de escribir estas tres líneas de código?
Tenga en cuenta que las operaciones funcionaron.
De acuerdo con Paul sobre el uso de ''loc''.
Para su caso applymap debería poder hacer esto:
cols = [''col1'', ''col2'', ''col3'']
df.loc[:, cols] = df[cols].applymap(some_function)
El problema aquí es que:
df.col1[df.col1 == 10]
devuelve una copia.
Entonces yo diría:
row_index = df.col1 == 10
# then with the form .loc[row_indexer,col_indexer]
df.loc[row_index, ''col1''] = 100