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 | ynumpy.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
FalsePython interprète normalement le
length des conteneurs (commelist,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.sizeorif not x.emptyau lieu deif x.If your
Seriescontains one and only one boolean value:>>> x = pd.Series([100])
>>> (x > 50).bool()
True
>>> (x < 50).bool()
FalseSi 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()
100Si 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
Enregistrer un commentaire