Le site or
et and
les déclarations python exigent truth
-valeurs. Pour pandas
Ces termes sont considérés comme ambigus, vous devez donc utiliser "bitwise". |
(ou) ou &
(et) des opérations :
result = result[(result['var']>0.25) | (result['var']<-0.25)]
Ceux-ci sont surchargés pour ce type de structures de données afin de produire la méthode par éléments. or
(ou and
).
Juste pour ajouter quelques explications supplémentaires à cette déclaration :
L'exception est levée lorsque l'on veut obtenir l'adresse de l'utilisateur. 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 trouvé, c'est un endroit où l'opérateur implicitement a 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().
En plus de ces 4 déclarations, il y a plusieurs fonctions python qui cachent quelques bool
(comme any
, all
, filter
...) qui ne posent normalement pas de problèmes avec pandas.Series
mais par souci d'exhaustivité, je tenais à les mentionner.
Dans votre cas, l'exception n'est pas vraiment utile, parce qu'elle ne mentionne pas la bonnes alternatives . Pour and
et or
que vous pouvez utiliser (si vous voulez des comparaisons par éléments) :
-
numpy.logical_or
:
>>> import numpy as np
>>> np.logical_or(x, y)
ou simplement le |
opérateur :
>>> x | y
-
numpy.logical_and
:
>>> np.logical_and(x, y)
ou simplement le &
opérateur :
>>> x & y
Si vous utilisez les opérateurs, assurez-vous de placer vos parenthèses correctement, en raison de la préséance de l'opérateur .
Il y a plusieurs fonctions logiques numpy dont devrait travailler sur pandas.Series
.
Les alternatives mentionnées dans l'Exception sont plus adaptées si vous avez rencontré ce problème en faisant if
ou while
. Je vais brièvement expliquer 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 l'option len
gth des conteneurs (comme list
, tuple
...) comme valeur de vérité si elle 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
ou if not x.empty
au lieu de if x
.
-
Si votre Series
contient le seul et unique valeur booléenne :
>>> x = pd.Series([100])
>>> (x > 50).bool()
True
>>> (x < 50).bool()
False
-
Si vous voulez vérifier le premier et seul é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 tous ou tout L'élément n'est pas nul, pas vide ou pas 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
90 votes
Utiliser
|
au lieu deor
4 votes
Voici une solution de contournement :
abs(result['var'])>0.25
5 votes
En rapport : Opérateurs logiques pour l'indexation booléenne dans Pandas
0 votes
J'ai rencontré le même message d'erreur en utilisant la méthode standard
max()
fonction. En le remplaçant parnumpy.maximum()
pour les maxima par élément entre deux valeurs a résolu mon problème.