Les instructions oret andpython nécessitent truth-values. Pour pandasceux-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' boolun 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é 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().
En plus de ces 4 déclarations il y a plusieurs fonctions de python qui cachent des boolappels (comme any, all, filter, ...) ceux - ci ne sont généralement pas problématique , pandas.Seriesmais 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 andet orvous 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 ifou 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 lenGTH 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.sizeou if not x.emptyau lieu de if x.
Si votre Seriescontient 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