Suponga que tengo un DataFrame de pandas con dos columnas, A y B. Me gustaría modificar este DataFrame (o crear una copia) para que B siempre sea NaN siempre que A sea 0. ¿Cómo lo lograría?
Probé lo siguiente
df['A'==0]['B'] = np.nan
y
df['A'==0]['B'].values.fill(np.nan)
sin éxito.
where
como se ve en esta solución a continuaciónRespuestas:
Uso
.loc
para indexación basada en etiquetas:La
df.A==0
expresión crea una serie booleana que indexa las filas,'B'
selecciona la columna. También puede usar esto para transformar un subconjunto de una columna, por ejemplo:No sé lo suficiente sobre los elementos internos de los pandas para saber exactamente por qué eso funciona, pero el problema básico es que a veces la indexación en un DataFrame devuelve una copia del resultado, y a veces devuelve una vista del objeto original. Según la documentación aquí , este comportamiento depende del comportamiento numpy subyacente. He descubierto que acceder a todo en una operación (en lugar de [uno] [dos]) es más probable que funcione para la configuración.
fuente
Aquí hay documentos de pandas sobre indexación avanzada:
¡La sección explicará exactamente lo que necesita! Resulta que
df.loc
(como .ix ha quedado en desuso, como muchos han señalado a continuación) se puede usar para cortar / cortar en frío un marco de datos. Y. También se puede usar para configurar cosas.Así que la respuesta de Bren está diciendo 'yo encontrar todos los lugares donde
df.A == 0
, seleccione la columnaB
y la puso anp.nan
'fuente
loc[selection criteria, columns I want]
se te pega perfectamente a la mente ...A partir de pandas 0.20 ix está en desuso . La forma correcta es usar df.loc
aquí hay un ejemplo de trabajo
Explicación:
Como se explica en el documento aquí ,
.loc
se basa principalmente en etiquetas, pero también se puede usar con una matriz booleana .Entonces, lo que estamos haciendo arriba es aplicar
df.loc[row_index, column_index]
por:loc
puede tomar una matriz booleana como una máscara que le dice a los pandas en qué subconjunto de filas queremos cambiarrow_index
loc
también se basa en la etiqueta para seleccionar la columna utilizando la etiqueta'B'
en elcolumn_index
Podemos usar lógica, condición o cualquier operación que devuelva una serie de booleanos para construir la matriz de booleanos. En el ejemplo anterior, queremos cualquiera
rows
que contenga un0
, para eso podemos usardf.A == 0
, como puede ver en el ejemplo a continuación, esto devuelve una serie de booleanos.Luego, usamos la matriz de booleanos anterior para seleccionar y modificar las filas necesarias:
Para obtener más información, consulte la documentación de indexación avanzada aquí .
fuente
Para un aumento masivo de la velocidad, use la función where de NumPy.
Preparar
Cree un DataFrame de dos columnas con 100,000 filas con algunos ceros.
Solución rápida con
numpy.where
Tiempos
Numpy's
where
es aproximadamente 4 veces más rápidofuente
.values
ennp.where(df.a.values == 0, np.nan, df.b.values)
? Parece quenp.where(df.a == 0, np.nan, df.b)
también funciona?Para reemplazar las columnas múltiples, conviértalas en una matriz numpy usando
.values
:fuente