2013-06-20 17 views
19

trotz mindestens twogood Tutorials zu sein, wie man Index ein Datenrahmen in pandas der Python-Bibliothek, ich kann immer noch nicht über eine elegante Art und Weise von SELECT trainiert mehr als eine Spalte ing auf.Python Pandas: Boolean Indizierung auf mehreren Spalten

>>> d = pd.DataFrame({'x':[1, 2, 3, 4, 5], 'y':[4, 5, 6, 7, 8]}) 
>>> d 
    x y 
0 1 4 
1 2 5 
2 3 6 
3 4 7 
4 5 8 
>>> d[d['x']>2] # This works fine 
    x y 
2 3 6 
3 4 7 
4 5 8 
>>> d[d['x']>2 & d['y']>7] # I had expected this to work, but it doesn't 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all() 

Ich habe festgestellt (was ich denke, ist) eine ziemlich unelegant Art und Weise tun, wie dies

>>> d[d['x']>2][d['y']>7] 

Aber es ist nicht schön, und es Partituren ziemlich niedrig, um die Lesbarkeit (glaube ich).

Gibt es einen besseren, python-tastischen Weg?

Antwort

50

Es handelt sich um ein Vorrang-Operator-Problem.

Sie zusätzliche Klammer hinzufügen sollten Ihren Multi Zustand Testarbeits machen:

d[(d['x']>2) & (d['y']>7)] 

This section des Tutorials Sie erwähnt zeigt ein Beispiel mit mehreren Booleschen Bedingungen und der Klammer verwendet werden.

1

Es kann immer noch einen besseren Weg geben, aber

In [56]: d[d['x'] > 2] and d[d['y'] > 7] 
Out[56]: 
    x y 
4 5 8 

funktioniert.

+1

dies funktioniert, aber endet mit Python-Operatoren (anstatt numpy) und so wird viel langsamer sein – Jeff

+0

das ist eine nette Lösung. Ich mag die Tatsache, dass explizit 'und' verwendet wird. Stellt klar, dass zwei Bedingungen ausgewertet werden. – LondonRob

+0

Oh, ich habe gerade [ein Duplikat] (http://stackoverflow.com/questions/8916302/selecting-across-multiple-columns-with-python-pandas) dieser Frage gefunden. Hoppla. – LondonRob

Verwandte Themen