2017-02-07 5 views
2

Wenn ich durch Verkettung verschiedener Bedingungen mit "UND" auswählen, funktioniert die Auswahl gut. Wenn ich durch Verketten von Bedingungen mit "ODER" wähle, löst die Auswahl einen Fehler aus.Pandas Slicing/Selecting mit mehreren Bedingungen mit oder Anweisung

>>> 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(). 

Ich würde erwarten, dass es den gesamten Datenrahmen zurückgibt, da alle Zeilen diese Bedingung erfüllen.

Antwort

5

Die wichtige Sache zu beachten ist, dass &-and nicht identisch ist, dass sie verschiedene Dinge sind, so dass die „oder“ äquivalent & zu ist |

Normalerweise bitweise logischen Operatoren anstatt die beiden & und | sind Python "logische" Operatoren.

In Pandas sind diese Operatoren für Series Betrieb überlastet.

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 
+2

Und hier 'loc' weglassen werden kann, ist es reine [' boolean indexing'] (http://pandas.pydata.org/pandas-docs/stable/indexing.html#boolean-indexing). 'loc' wird verwendet, wenn Sie einige Spalten wie' df.loc [(df.a! = 1) | (df.b <5), 'a'] 'oder' df.loc [(df.a! = 1) | (df.b <5), ['a', 'b']] ' – jezrael

+0

Und dann nette Antwort;) – jezrael

Verwandte Themen