Les instructions or
et and
python nécessitent truth
-values. Pour pandas
ceux-ci sont considérés comme ambigus, vous devez donc utiliser les opérations "au niveau du bit" |
(ou) ou &
(et):
result = result[(result['var']>0.25) | (result['var']<-0.25)]
Ceux-ci sont surchargés pour ce type de infrastructures de données pour produire l'élément or
(ou and
).
Juste pour ajouter quelques explications à cette déclaration:
L'exception est levée lorsque vous voulez obtenir l' bool
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 touché était un endroit où l'opérateur a implicitement converti les opérandes bool
(vous l'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 de python qui cachent des bool
appels (comme any
, all
, filter
, ...) ceux - ci ne sont généralement pas problématique , pandas.Series
mais pour être complet que je voulais mentionner ces derniers .
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 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 vos parenthèses en raison de la priorité de l'opérateur .
Il existe plusieurs fonctions logiques numpy qui devraient fonctionner pandas.Series
.
Les alternatives mentionnées dans l'exception sont plus adaptées si vous l'avez rencontré lors de l'exécution de if
ou while
. Je vais expliquer brièvement chacun de ces éléments:
Si vous souhaitez 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 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 une et une seule valeur booléenne:
>>> x = pd.Series([100])
>>> (x > 50).bool()
True
>>> (x < 50).bool()
False
Si vous souhaitez vérifier le premier et le seul élément de votre série (comme .bool()
mais fonctionne même pour le contenu non booléen):
>>> x = pd.Series([100])
>>> x.item()
100
Si vous souhaitez vérifier si tout ou partie d' un élément n'est pas 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
|
au lieu deor