La valeur de vérité d'une série est ambiguë. Utilisez a.empty, a.bool(), a.item(), a.any() ou a.all()

Je souhaite filtrer mon dataframe avec une orcondition pour conserver les lignes avec les valeurs d'une colonne particulière qui sont en dehors de la plage [-0.25, 0.25]. J'ai essayé:

df = df[(df['col'] < -0.25) or (df['col'] > 0.25)]

Mais j'obtiens l'erreur:

La valeur de vérité d'une série est ambiguë. Utilisez a.empty, a.bool(), a.item(), a.any() ou a.all()


Solution du problème

Les instructions oret andpython nécessitent truth-values. Pour pandasceux-ci sont considérés comme ambigus, vous devez donc utiliser des opérations "au niveau du bit" |(ou) ou &(et) :

df = df[(df['col'] < -0.25) | (df['col'] > 0.25)]

Celles-ci sont surchargées pour ce type de structures de données afin de produire le élément par élément or(ou and).

Juste pour ajouter quelques explications supplémentaires à cette déclaration:

L'exception est levée lorsque vous voulez obtenir le boold'un pandas.Series:

>>> import pandas as pd
>>> x = pd.Series([1])
>>> bool(x)
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

Ce que vous avez frappé était un endroit où l'opérateur a implicitement converti les opérandes en bool(vous avez utilisé ormais cela arrive aussi pour and, ifet while):

>>> x or x
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
>>> x and x
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
>>> if x:
... print('fun')
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
>>> while x:
... print('fun')
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

Outre ces 4 déclarations, il existe plusieurs fonctions python qui cachent certains boolappels (comme any, all, filter,...) ceux-ci ne sont normalement pas problématiques pandas.Seriesmais pour être complet, je voulais les mentionner.

Dans votre cas, l'exception n'est pas vraiment utile, car elle ne mentionne pas les bonnes alternatives. Pour andet orvous pouvez utiliser (si vous voulez des comparaisons élément par élément):


  • numpy.logical_or:

     >>> import numpy as np
    >>> np.logical_or(x, y)

    ou simplement l' |opérateur:

     >>> x | y


  • numpy.logical_and:

     >>> np.logical_and(x, y)

    ou simplement l' &opérateur:

     >>> x & y



Si vous utilisez les opérateurs, assurez-vous de définir correctement votre parenthèse en raison de la priorité des opérateurs.

Il existe plusieurs fonctions numpy logiques qui devraient work on pandas.Series.

Les alternatives mentionnées dans l'exception sont plus adaptées si vous l'avez rencontrée en faisant ifou while. Je vais expliquer brièvement chacun d'entre eux :


  • Si vous voulez vérifier si votre Série est vide:

     >>> x = pd.Series([])
    >>> x.empty
    True
    >>> x = pd.Series([1])
    >>> x.empty
    False

    Python interprète normalement le length des conteneurs (comme list, tuple,...) comme valeur de vérité s'il n'a pas d'interprétation booléenne explicite. Donc, si vous voulez la vérification de type python, vous pouvez faire: if x.sizeor if not x.emptyau lieu de if x.


  • If your Series contains one and only one boolean value:

     >>> x = pd.Series([100])
    >>> (x > 50).bool()
    True
    >>> (x < 50).bool()
    False


  • Si vous souhaitez vérifier le premier et unique élément de votre série (comme .bool()mais fonctionne même pour les contenus non booléens):

     >>> x = pd.Series([100])
    >>> x.item()
    100


  • Si vous voulez vérifier si tout ou partie des éléments est non nul, non vide ou non faux :

     >>> x = pd.Series([0, 1, 2])
    >>> x.all() # because one element is zero
    False
    >>> x.any() # because one (or more) elements are non-zero
    True


Commentaires

Posts les plus consultés de ce blog

Erreur Symfony : "Une exception a été levée lors du rendu d'un modèle"

Détecter les appuis sur les touches fléchées en JavaScript

Une chaîne vide donne "Des erreurs ont été détectées dans les arguments de la ligne de commande, veuillez vous assurer que tous les arguments sont correctement définis"