es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Utilizando el dtype integer nullable de pandas en la condición np.where.

Tengo un DataFrame a continuación que tiene algunos valores faltantes.

df = pd.DataFrame(data=[['A', 1, None], ['B', 2, 5]],
                  columns=['X', 'Y', 'Z'])

Dado que df['Z'] se supone que es una columna entera, cambié su tipo de datos al nuevo tipo experimental de Pandas llamado “entero nullable” como se muestra a continuación.

df['Z'] = df['Z'].astype(pd.Int32Dtype())
df
   X  Y     Z
0  A  1  <na>
1  B  2     5

Ahora estoy tratando de usar un método simple de Numpy where para reemplazar los valores no nulos en la columna df['Z'] con un valor entero fijo (digamos 1) usando el siguiente código.

np.where(pd.isna(df['Z']), pd.NA, np.where(df['Z'] > 0, 1, 0))

Sin embargo, obtengo el siguiente error y no puedo entender por qué, ya que ya estoy verificando las filas con valores nulos en la primera condición.

TypeError: boolean value of NA is ambiguous

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    El mensaje de error sugiere que el valor booleano de NA es ambiguo, lo que significa que pandas no puede determinar si NA debe considerarse Verdadero o Falso. Esto puede suceder cuando se trabaja con datos faltantes, ya que la ausencia de un valor hace que no esté claro si una condición debe evaluarse como Verdadero o Falso.

    En el código proporcionado, el error ocurre porque la expresión ydf ['Z']> 0 devuelve una matriz booleana que incluye valores NA. Cuando esta matriz se anida dentro del método np.where, pandas no puede determinar si los valores NA deben considerarse Verdaderos o Falsos, por lo que se produce el error.

    Para solucionar este problema, puedes usar la función pd.notna en lugar de pd.isna para buscar valores no nulos en la primera condición de np.where. Esta función maneja explícitamente los valores faltantes y devuelve una matriz booleana sin valores NA. Aquí está el código actualizado:

    np.where (pd.notna (ydf ['Z']), 1, pd.NA)
    

    Esto reemplazará los valores no nulos en la columna ydf ['Z'] con 1 y dejará los valores faltantes como NA.

Comments are closed.