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.

wherecomo se ve en esta solución a continuaciónRespuestas:
Uso
.locpara indexación basada en etiquetas:La
df.A==0expresió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 columnaBy 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í ,
.locse 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:locpuede tomar una matriz booleana como una máscara que le dice a los pandas en qué subconjunto de filas queremos cambiarrow_indexloctambién se basa en la etiqueta para seleccionar la columna utilizando la etiqueta'B'en elcolumn_indexPodemos 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
rowsque 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.whereTiempos
Numpy's
wherees aproximadamente 4 veces más rápidofuente
.valuesennp.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