Establecer el valor para una celda particular en pandas DataFrame usando el índice
He creado un DataFrame de Pandas
df = DataFrame(index=['A','B','C'], columns=['x','y'])
Ahora, me gustaría asignar un valor a una celda en particular, por ejemplo, a una fila C
y una columna x
. En otras palabras, me gustaría realizar la siguiente transformación:
x y x y
A NaN NaN A NaN NaN
B NaN NaN ⟶ B NaN NaN
C NaN NaN C 10 NaN
con este código:
df.xs('C')['x'] = 10
Sin embargo, el contenido de df
no ha cambiado. El marco de datos contiene una vez más solo NaN
s. ¿Cómo hago lo que quiero?
La respuesta de RukTech , df.set_value('C', 'x', 10)
es mucho más rápida que las opciones que sugerí a continuación. Sin embargo, está previsto que quede obsoleto .
De ahora en adelante, el método recomendado es.iat/.at
.
Por qué df.xs('C')['x']=10
no funciona:
df.xs('C')
de forma predeterminada, devuelve un nuevo marco de datos con una copia de los datos, por lo que
df.xs('C')['x']=10
modifica este nuevo marco de datos únicamente.
df['x']
devuelve una vista del df
marco de datos, por lo que
df['x']['C'] = 10
se modifica df
a sí mismo.
Advertencia : a veces es difícil predecir si una operación devuelve una copia o una vista. Por este motivo, los documentos recomiendan evitar asignaciones con "indexación encadenada" .
Entonces la alternativa recomendada es
df.at['C', 'x'] = 10
que sí modifica df
.
In [18]: %timeit df.set_value('C', 'x', 10)
100000 loops, best of 3: 2.9 µs per loop
In [20]: %timeit df['x']['C'] = 10
100000 loops, best of 3: 6.31 µs per loop
In [81]: %timeit df.at['C', 'x'] = 10
100000 loops, best of 3: 9.2 µs per loop
Actualización: el .set_value
método quedará obsoleto . .iat/.at
son buenos reemplazos, desafortunadamente pandas proporciona poca documentación
La forma más rápida de hacer esto es usar set_value . Este método es ~100 veces más rápido que .ix
el método. Por ejemplo:
df.set_value('C', 'x', 10)
También puede utilizar una búsqueda condicional .loc
como se ve aquí:
df.loc[df[<some_column_name>] == <condition>, [<another_column_name>]] = <value_to_add>
¿Dónde <some_column_name
está la columna con la que desea comparar la <condition>
variable y <another_column_name>
la columna a la que desea agregar (puede ser una columna nueva o una que ya existe)? <value_to_add>
es el valor que desea agregar a esa columna/fila.
Este ejemplo no funciona precisamente con la pregunta en cuestión, pero podría resultar útil si alguien quiere agregar un valor específico en función de una condición.
Intenta usardf.loc[row_index,col_indexer] = value