web-dev-qa-db-fra.com

Pandas découpage / sélection avec plusieurs conditions avec ou instruction

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.

8
jtorca

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
17
Steve Barnes