web-dev-qa-db-fra.com

Filtrage des lignes de données par valeurs de colonne

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é?

7
Seunghun Choi

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
14
jezrael

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.

5
Willem Van Onsem