Lorsque je sélectionne en enchaînant différentes conditions avec "ET", la sélection fonctionne correctement. Lorsque je sélectionne en enchaînant les conditions avec "OU", la sélection génère une erreur.
>>> import pandas as pd
>>> import numpy as np
>>> df = pd.DataFrame([[1,4,3],[2,3,5],[4,5,6],[3,2,5]],
... columns=['a', 'b', 'c'])
>>> df
a b c
0 1 4 3
1 2 3 5
2 4 5 6
3 3 2 5
>>> df.loc[(df.a != 1) & (df.b < 5)]
a b c
1 2 3 5
3 3 2 5
>>> df.loc[(df.a != 1) or (df.b < 5)]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python3/dist-packages/pandas/core/generic.py", line 731, in __nonzero__
.format(self.__class__.__name__))
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
Je m'attendrais à ce qu'il renvoie l'intégralité de la trame de données car toutes les lignes remplissent cette condition.
La chose importante à noter est que &
n'est pas identique à and
ce sont des choses différentes, donc le "ou" équivalent à &
est |
Normalement, les deux &
et |
sont au niveau du bit opérateurs logiques plutôt que python opérateurs "logiques").
Dans pandas ces opérateurs sont surchargés pour l'opération Series
.
In [1]: import pandas as pd
In [2]: import numpy as np
In [3]: df = pd.DataFrame([[1,4,3],[2,3,5],[4,5,6],[3,2,5]], columns=['a', 'b',
...: 'c'])
In [4]: df
Out[4]:
a b c
0 1 4 3
1 2 3 5
2 4 5 6
3 3 2 5
In [5]: df.loc[(df.a != 1) & (df.b < 5)]
Out[5]:
a b c
1 2 3 5
3 3 2 5
In [6]: df.loc[(df.a != 1) | (df.b < 5)]
Out[6]:
a b c
0 1 4 3
1 2 3 5
2 4 5 6
3 3 2 5