Esta línea devuelve las primeras 4 filas en el marco combined
de datos parafeature_a
combined.iloc[0:4]["feature_a"]
Como se esperaba, esta línea siguiente devuelve las filas 2da, 4ta y 16ta en el marco de datos para la columna feature_a
:
combined.iloc[[1,3,15]]["feature_a"]
Esta línea establece las primeras 4 filas en el marco de datos para feature_a
a 77
.
combined.iloc[0:4]["feature_a"] = 77
Esta línea hace algo. Están ocurriendo algún tipo de cálculos, ya que lleva más tiempo cuando se aplica a una lista más larga.
combined.iloc[[1,3,15]]["feature_a"] = 88
Las filas 2da, 4ta y 16ta no se configuran 88
cuando se verifica con esto:
combined.iloc[[1,3,15]]["feature_a"]
¿Cómo puedo establecer una lista arbitraria de filas de una columna de un marco de datos a un valor sin tomar un desvío de codificación masivo?
Este escenario parece que debería ser bastante sencillo y común.
Respuestas:
Si invierte los selectores y selecciona primero por columna, funcionará bien:
Código:
¿Por qué?
Cuando hizo la primera (forma no funcional), está seleccionando una sección no contigua del marco de datos. Deberías haber recibido la advertencia:
Esto se debe a que están teniendo lugar dos operaciones independientes.
combined.iloc[[1,3,15]]
crea un nuevo marco de datos de solo tres filas, y el marco se copia necesariamente. luego...["feature_a"]
pero se selecciona contra la copia.Entonces la tarea va a la copia. Hay varias formas de arreglar esto, pero en este caso, es más fácil (y más barato) seleccionar primero la columna, luego seleccionar partes de las columnas para asignarlas.
Código de prueba:
Resultados:
fuente