Comment réparer : ValueError : impossible de masquer avec un tableau non booléen contenant des valeurs NA/NaN



Une erreur que vous pouvez rencontrer lors de l’utilisation de pandas est :

ValueError: Cannot mask with non-boolean array containing NA / NaN values

Cette erreur se produit généralement lorsque vous essayez de trouver les lignes d’un DataFrame pandas qui contiennent une chaîne particulière, mais que la colonne dans laquelle vous recherchez a des valeurs NaN.

L’exemple suivant montre comment corriger cette erreur dans la pratique.

Comment reproduire l’erreur

Supposons que nous ayons le DataFrame pandas suivant :

import pandas as pd
import numpy as np

#create DataFrame
df = pd.DataFrame({'team': ['A', 'A', 'A', 'B', 'B'],
                   'position': ['Guard', 'Guard', np.nan, 'Guard', 'Forward'],
                   'points': [22, 28, 14, 13, 19]})

#view DataFrame
print(df)

  team position  points
0    A    Guard      22
1    A    Guard      28
2    A      NaN      14
3    B    Guard      13
4    B  Forward      19

Supposons maintenant que nous essayions d’accéder à toutes les lignes du DataFrame où la colonne de position contient la chaîne « Guard » :

#access all rows where position column contains 'Guard'
df[df['position'].str.contains('Guard')]

ValueError: Cannot mask with non-boolean array containing NA / NaN values

Nous recevons une erreur car il y a une valeur NaN dans la colonne position .

Comment réparer l’erreur

Pour éviter cette erreur, il suffit d’utiliser l’argument na=False dans la fonction str.contains() :

#access all rows where position column contains 'Guard', ignore NaN
df[df['position'].str.contains('Guard', na=False)]

        team	position  points
0	A	Guard	  22
1	A	Guard	  28
3	B	Guard	  13

Cette fois, nous pouvons accéder à toutes les lignes contenant « Guard » dans la colonne de position sans aucune erreur.

Une autre façon d’éviter cette erreur consiste à utiliser .fillna(False) comme suit :

#access all rows where position column contains 'Guard', ignore NaN
df[df['position'].str.contains('Guard').fillna(False)]

        team	position  points
0	A	Guard	  22
1	A	Guard	  28
3	B	Guard	  13

Une fois de plus, nous pouvons accéder à toutes les lignes contenant « Guard » dans la colonne de position sans aucune erreur.

Ressources additionnelles

Les didacticiels suivants expliquent comment corriger d’autres erreurs courantes en Python :

Comment réparer KeyError dans Pandas
Comment réparer : ValueError : impossible de convertir le float NaN en entier
Comment réparer : ValueError : les opérandes n’ont pas pu être diffusés avec les formes

Ajouter un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *