He creado un marco de datos de Pandas
df = DataFrame(index=['A','B','C'], columns=['x','y'])
y tengo esto
xy A NaN NaN B NaN NaN C NaN NaN
Luego quiero asignar valor a una celda en particular, por ejemplo para la fila 'C' y la columna 'x'. Esperaba obtener ese resultado:
xy A NaN NaN B NaN NaN C 10 NaN
con este código:
df.xs('C')['x'] = 10
pero el contenido de df
no ha cambiado. De nuevo, solo NaN
está en DataFrame.
¿Alguna sugerencia?
df['x']['C']
), usedf.ix['x','C']
.dataframe[column (series)] [row (Series index)]
mientras que muchas personas (incluido yo mismo) están más acostumbradas aldataframe[row][column]
orden. Como programador de Matlab and R, este último me parece más intuitivo, pero al parecer esa no es la forma en que trabaja Pandas ...Respuestas:
La respuesta de RukTech ,
df.set_value('C', 'x', 10)
, es de lejos más rápido que las opciones que he sugerido a continuación. Sin embargo, se ha programado para la desaprobación .En adelante, el método recomendado es
.iat/.at
.¿
df.xs('C')['x']=10
Por qué no funciona?df.xs('C')
de forma predeterminada, devuelve un nuevo marco de datos con una copia de los datos, por lo quesolo modifica este nuevo marco de datos.
df['x']
devuelve una vista deldf
marco de datos, entoncesse modifica a
df
sí mismo.Advertencia : a veces es difícil predecir si una operación devuelve una copia o una vista. Por esta razón, los documentos recomiendan evitar las asignaciones con "indexación encadenada" .
Entonces la alternativa recomendada es
los cuales no modificar
df
.fuente
df.x
en la API . ¿Qué querías decir?'x'
es el nombre de una columna endf
.df.x
devuelve unSeries
con los valores en la columnax
. Lo cambiaré adf['x']
ya que esta notación funcionará con cualquier nombre de columna (a diferencia de la notación de puntos) y creo que es más clara.df.x
era un nuevo método desconocido juntodf.xs, df.ix
df.xs(..., copy=True)
devuelve una copia, y ese es el comportamiento predeterminado.df.xs(..., copy=False)
Devuelve el original.Actualización: el
.set_value
método va a estar en desuso ..iat/.at
son buenos reemplazos, desafortunadamente los pandas proporcionan poca documentaciónLa forma más rápida de hacer esto es usar set_value . Este método es ~ 100 veces más rápido que el
.ix
método. Por ejemplo:df.set_value('C', 'x', 10)
fuente
df['x']['C'] = 10
.df=df.append(df.sum(numeric_only=True),ignore_index=True)
?También puede usar una búsqueda condicional
.loc
como se ve aquí:dónde
<some_column_name
está la columna con la que desea verificar la<condition>
variable y<another_column_name>
es la columna a la que desea agregar (puede ser una nueva columna 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 ser útil para alguien que quiera agregar un valor específico en función de una condición.
fuente
df.loc[df['age']==3, ['age-group']] = 'toddler'
La forma recomendada (según los mantenedores) para establecer un valor es:
El uso de 'indexación encadenada' (
df['x']['C']
) puede generar problemas.Ver:
fuente
ix
está en desuso: pandas-docs.github.io/pandas-docs-travis/…Intenta usar
df.loc[row_index,col_indexer] = value
fuente
¡Esto es lo único que funcionó para mí!
Obtenga más información sobre
.loc
aquí .fuente
.loc
reemplazar.iat/.at
?at
Similar aloc
, en que ambos proporcionan búsquedas basadas en etiquetas. Úseloat
si solo necesita obtener o establecer un solo valor en un DataFrame o Series. De padas doc.iat/.at
Es la buena solución. Supongamos que tiene este simple data_frame:si queremos modificar el valor de la celda,
[0,"A"]
podemos usar una de esas soluciones:df.iat[0,0] = 2
df.at[0,'A'] = 2
Y aquí hay un ejemplo completo de cómo usar
iat
para obtener y establecer un valor de celda:y_train antes:
y_train después de llamar a la función de preposesión que
iat
cambia para multiplicar el valor de cada celda por 2:fuente
Para establecer valores, use:
set_value
,ix
han quedado en desuso.iloc
yloc
fuente
puedes usar
.iloc
.fuente
df.iloc[[2:8], [0]] = [2,3,4,5,6,7]
que hace el método dedf.loc()
forma nativa.En mi ejemplo, solo lo cambio en la celda seleccionada
'resultado' es un DataField con la columna 'peso'
fuente
set_value()
es obsoleto.A partir de la versión 0.23.4, Pandas " anuncia el futuro " ...
Teniendo en cuenta este consejo, aquí hay una demostración de cómo usarlos:
Referencias
fuente
Aquí hay un resumen de las soluciones válidas proporcionadas por todos los usuarios, para marcos de datos indexados por entero y cadena.
df.iloc, df.loc y df.at funcionan para ambos tipos de marcos de datos, df.iloc solo funciona con índices enteros de fila / columna, df.loc y df.at son compatibles para establecer valores usando nombres de columna y / o índices enteros .
Cuando el índice especificado no existe, tanto df.loc como df.at agregarían las filas / columnas recién insertadas al marco de datos existente, pero df.iloc generaría "IndexError: los indexadores posicionales están fuera de los límites". Un ejemplo de trabajo probado en Python 2.7 y 3.7 es el siguiente:
fuente
Lo probé y la salida es un
df.set_value
poco más rápida, pero el método oficialdf.at
parece ser la forma más rápida y desaprobada de hacerlo.Tenga en cuenta que esto es establecer el valor para una sola celda. Para los vectores
loc
yiloc
deberían ser mejores opciones ya que están vectorizados.fuente
Una forma de usar el índice con condición es primero obtener el índice de todas las filas que satisfacen su condición y luego simplemente usar esos índices de fila de varias maneras
La condición de ejemplo es como
Luego puede usar estos índices de fila en una variedad de formas como
Todo esto es posible porque .index devuelve una matriz de índice que .loc puede usar con direccionamiento directo, por lo que evita los recorridos una y otra vez.
fuente
df.loc['c','x']=10
Esto cambiará el valor de la fila c y la columna x .fuente
Además de las respuestas anteriores, aquí hay un punto de referencia que compara diferentes formas de agregar filas de datos a un marco de datos ya existente. Muestra que usar at o set-value es la forma más eficiente para grandes marcos de datos (al menos para estas condiciones de prueba).
Para la prueba, se utilizó un marco de datos existente que comprende 100,000 filas y 1,000 columnas y valores aleatorios numpy. A este marco de datos, se agregaron 100 filas nuevas.
Código ver abajo:
fuente
Si desea cambiar los valores no para toda la fila, sino solo para algunas columnas:
fuente
Desde la versión 0.21.1 también puede usar el
.at
método. Hay algunas diferencias en comparación con.loc
lo mencionado aquí: pandas .at versus .loc , pero es más rápido en el reemplazo de un solo valorfuente
Entonces, su pregunta para convertir NaN en ['x', C] al valor 10
la respuesta es..
el código alternativo es
fuente
Yo también estaba buscando este tema y preparé una forma de iterar a través de un DataFrame y actualizarlo con valores de búsqueda de un segundo DataFrame. Aquí está mi código.
fuente