Establecer el valor para una celda particular en pandas DataFrame usando el índice

Resuelto Mitkp asked hace 12 años • 25 respuestas

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 Cy 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 dfno ha cambiado. El marco de datos contiene una vez más solo NaNs. ¿Cómo hago lo que quiero?

Mitkp avatar Dec 12 '12 21:12 Mitkp
Aceptado

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']=10no 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 dfmarco de datos, por lo que

df['x']['C'] = 10

se modifica dfa 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 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
unutbu avatar Dec 12 '2012 14:12 unutbu

Actualización: el .set_valuemétodo quedará obsoleto . .iat/.atson 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 .ixel método. Por ejemplo:

df.set_value('C', 'x', 10)
RukTech avatar Jul 01 '2014 19:07 RukTech

También puede utilizar una búsqueda condicional .loccomo se ve aquí:

df.loc[df[<some_column_name>] == <condition>, [<another_column_name>]] = <value_to_add>

¿Dónde <some_column_nameestá 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.

Blairg23 avatar Jul 19 '2016 19:07 Blairg23

Intenta usardf.loc[row_index,col_indexer] = value

Yash avatar Oct 15 '2015 13:10 Yash