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?
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
La forma recomendada (según los mantenedores) para establecer un valor es:
df.ix[''x'',''C'']=10
El uso de ''indexación encadenada'' ( df[''x''][''C'']
) puede ocasionar problemas.
Ver:
- https://.com/a/21287235/1579844
- http://pandas.pydata.org/pandas-docs/dev/indexing.html#indexing-view-versus-copy
- https://github.com/pydata/pandas/pull/6031
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