Je filtre les lignes d'un dataframe par valeurs dans deux colonnes.
Pour une raison quelconque, l'opérateur OR se comporte comme je m'attendrais à ce que l'opérateur AND se comporte et vice versa.
Mon code de test:
import pandas as pd
df = pd.DataFrame({'a': range(5), 'b': range(5) })
# let's insert some -1 values
df['a'][1] = -1
df['b'][1] = -1
df['a'][3] = -1
df['b'][4] = -1
df1 = df[(df.a != -1) & (df.b != -1)]
df2 = df[(df.a != -1) | (df.b != -1)]
print pd.concat([df, df1, df2], axis=1,
keys = [ 'original df', 'using AND (&)', 'using OR (|)',])
Et le résultat:
original df using AND (&) using OR (|)
a b a b a b
0 0 0 0 0 0 0
1 -1 -1 NaN NaN NaN NaN
2 2 2 2 2 2 2
3 -1 3 NaN NaN -1 3
4 4 -1 NaN NaN 4 -1
[5 rows x 6 columns]
Comme vous pouvez le voir, l' AND
opérateur supprime chaque ligne dans laquelle au moins une valeur est égale -1
. D'autre part, l' OR
opérateur exige que les deux valeurs soient égales à -1
pour les supprimer. Je m'attendrais exactement au résultat opposé. Quelqu'un pourrait-il expliquer ce comportement, s'il vous plaît?
J'utilise pandas 0.13.1.
df.query
etpd.eval
semblent bien adaptés à ce cas d'utilisation. Pour plus d'informations sur lapd.eval()
famille de fonctions, leurs caractéristiques et leurs cas d'utilisation, veuillez visiter Évaluation des expressions dynamiques dans les pandas à l'aide de pd.eval () .