J'essaie de modifier une variable __ DataFrame df
pour qu'elle ne contienne que les lignes pour lesquelles les valeurs de la colonne closing_price
sont comprises entre 99 et 101 et j'essaie de le faire avec le code ci-dessous.
Cependant, j'ai l'erreur
ValueError: la valeur de vérité d'une série est ambiguë. Utilisez a.empty, a.bool (), a.item (), a.any () ou a.all ()
et je me demande s’il existe un moyen de le faire sans utiliser de boucles.
df = df[(99 <= df['closing_price'] <= 101)]
Vous devriez utiliser ()
pour regrouper votre vecteur booléen afin de lever les ambiguïtés.
df = df[(df['closing_price'] >= 99) & (df['closing_price'] <= 101)]
Considérez aussi les séries entre :
df = df[df['closing_price'].between(99, 101, inclusive=True)]
il existe une alternative plus intéressante - utilisez query () method:
In [58]: df = pd.DataFrame({'closing_price': np.random.randint(95, 105, 10)})
In [59]: df
Out[59]:
closing_price
0 104
1 99
2 98
3 95
4 103
5 101
6 101
7 99
8 95
9 96
In [60]: df.query('99 <= closing_price <= 101')
Out[60]:
closing_price
1 99
5 101
6 101
7 99
UPDATE: répondant au commentaire:
J'aime la syntaxe ici, mais je suis tombé en essayant de combiner avec expresison;
df.query('(mean + 2 *sd) <= closing_price <=(mean + 2 *sd)')
In [161]: qry = "(closing_price.mean() - 2*closing_price.std())" +\
...: " <= closing_price <= " + \
...: "(closing_price.mean() + 2*closing_price.std())"
...:
In [162]: df.query(qry)
Out[162]:
closing_price
0 97
1 101
2 97
3 95
4 100
5 99
6 100
7 101
8 99
9 95
newdf = df.query('closing_price.mean() <= closing_price <= closing_price.std()')
ou
mean = closing_price.mean()
std = closing_price.std()
newdf = df.query('@mean <= closing_price <= @std')
Au lieu de cela
df = df[(99 <= df['closing_price'] <= 101)]
Vous devriez utiliser ceci
df = df[(df['closing_price']>=99 ) & (df['closing_price']<=101)]
Nous devons utiliser les opérateurs logiques bitwise |, &, ~, ^ de NumPy pour les requêtes composées . De plus, les parenthèses sont importantes pour la priorité des opérateurs.
Pour plus d'informations, vous pouvez visiter le lien: Comparaisons, masques et logique booléenne
Si vous utilisez plusieurs valeurs et plusieurs entrées, vous pouvez également configurer une fonction d’application comme celle-ci. Dans ce cas, filtrer une trame de données pour les positions GPS correspondant à certaines plages.
def filter_values(lat,lon):
if abs(lat - 33.77) < .01 and abs(lon - -118.16) < .01:
return True
Elif abs(lat - 37.79) < .01 and abs(lon - -122.39) < .01:
return True
else:
return False
df = df[df.apply(lambda x: filter_values(x['lat'],x['lon']),axis=1)]