panda index filas fila eliminar drop columns borrar python pandas dataframe

python - index - eliminar fila pandas



Establecer valor para una celda particular en pandas DataFrame usando índice (12)


He creado un marco de datos de pandas

df=DataFrame(index=[''A'',''B'',''C''], columns=[''x'',''y''])

y obtuve esto

x y 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''. He esperado obtener tal resultado:

x y A NaN NaN B NaN NaN C 10 NaN

con este código:

df.xs(''C'')[''x'']=10

Pero los contenidos de df no han cambiado. Nuevamente es solo de Nan en el marco de datos.

¿Alguna sugerencia?


¡Esto es lo único que me funcionó!

df.loc[''C'', ''x''] = 10

Aprenda más sobre .loc here .


Actualización: el método .set_value va a estar en desuso . .iat / .at son buenos reemplazos, desafortunadamente los pandas proporcionan 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 el método .ix . Por ejemplo:

df.set_value(''C'', ''x'', 10)


Desde la versión 0.21.1 también puede utilizar el método .at . Hay algunas diferencias en comparación con .loc como se mencionó aquí: pandas .at versus .loc , pero es más rápido en la sustitución de un solo valor


En mi ejemplo acabo de cambiarlo en la celda seleccionada

for index, row in result.iterrows(): if np.isnan(row[''weight'']): result.at[index, ''weight''] = 0.0

''resultado'' es un campo de datos con columna ''peso''


Intente usar df.loc[row_index,col_indexer] = value



Puedes usar .iloc .

df.iloc[[2], [0]] = 10


Si desea cambiar los valores no para toda la fila, sino solo para algunas columnas:

x = pd.DataFrame({''A'': [1, 2, 3], ''B'': [4, 5, 6]}) x.iloc[1] = dict(A=10, B=-10)


También puede usar una búsqueda condicional usando .loc como se ve aquí:

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

donde <some_column_name es la columna en la que desea verificar la variable <condition> y <another_column_name> es la columna a la que desea agregar (puede ser una nueva columna o una que ya exista). <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 basado en una condición.


Yo también estaba buscando este tema y armé una manera de iterar a través de un DataFrame y actualizarlo con los valores de búsqueda de un segundo DataFrame. Aquí está mi código.

src_df = pd.read_sql_query(src_sql,src_connection) for index1, row1 in src_df.iterrows(): for index, row in vertical_df.iterrows(): src_df.set_value(index=index1,col=u''etl_load_key'',value=etl_load_key) if (row1[u''src_id''] == row[''SRC_ID'']) is True: src_df.set_value(index=index1,col=u''vertical'',value=row[''VERTICAL''])


df.loc[''c'',''x'']=10 Esto cambiará el valor de c th row y x th column.


La respuesta de df.set_value(''C'', ''x'', 10) , df.set_value(''C'', ''x'', 10) , es mucho más rápida que las opciones que he sugerido a continuación. Sin embargo, ha sido programado para la desaprobación .

En el futuro, el método recomendado es .iat/.at .

Por qué df.xs(''C'')[''x'']=10 no funciona:

df.xs(''C'') por defecto, 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 solamente.

df[''x''] devuelve una vista del marco de datos df , por lo que

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

modifica df si 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" .

Así que la alternativa recomendada es

df.at[''C'', ''x''] = 10

el cual 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