J'ai un Dataframe df
Num1 Num2
one 1 0
two 3 2
three 5 4
four 7 6
five 9 8
Je souhaite filtrer les lignes dont la valeur est supérieure à 3 dans Num1 et inférieure à 8 dans Num2.
J'ai essayé
df = df[df['Num1'] > 3 and df['Num2'] < 8]
mais l'erreur s'est produite.
ValueError: La valeur de vérité d'une série est ambiguë.
donc j'ai utilisé
df = df[df['Num1'] > 3]
df = df[df['Num2'] < 8]
Je pense que le code peut être plus court.
Y-a t'il une autre possibilité?
Vous devez ajouter ()
parce que la priorité de l'opérateur avec l'opérateur au niveau du bit &
:
df1 = df[(df['Num1'] > 3) & (df['Num2'] < 8)]
print (df1)
Num1 Num2
three 5 4
four 7 6
Une meilleure explication est ici .
Ou si vous avez besoin du code le plus court, utilisez query
:
df1 = df.query("Num1 > 3 and Num2 < 8")
print (df1)
Num1 Num2
three 5 4
four 7 6
df1 = df.query("Num1 > 3 & Num2 < 8")
print (df1)
Num1 Num2
three 5 4
four 7 6
Oui, vous pouvez utiliser l'opérateur &
:
df = df[(df['Num1'] > 3) & (df['Num2'] < 8)]
# ^ & operator
En effet, and
fonctionne sur valeur de véracité des deux opérandes, tandis que l'opérateur &
Peut être défini sur des structures de données arbitraires.
Les crochets sont obligatoires ici, car &
Se lie plus court que >
Et <
, Donc sans crochets, Python lirait l'expression comme df['Num1'] > (3 & df['Num2']) < 8
.
Notez que vous pouvez utiliser l'opérateur |
Comme ou logique.