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 or
condition 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 or
et and
python nécessitent truth
-values. Pour pandas
ceux-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 bool
d'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é or
mais cela arrive aussi pour and
, if
et 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 bool
appels (comme any
, all
, filter
,...) ceux-ci ne sont normalement pas problématiques pandas.Series
mais 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 and
et or
vous 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 if
ou 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
len
gth 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.size
orif not x.empty
au lieu deif x
.If your
Series
contains 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