2013-06-20 20 views
19

pomimo istnienia przynajmniej twogood tutoriale, jak indeksować DataFrame w pandas biblioteki Pythona, ja wciąż nie może wypracować elegancki sposób SELECT ing na więcej niż jedną kolumnę.Python Pandy: Boolean indeksowanie na wielu kolumnach

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

znalazłem (co moim zdaniem jest) raczej nieeleganckiego sposób to zrobić, jak to

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

Ale to nie jest ładna, i uzyskuje wynik dość niskie dla czytelności (chyba).

Czy jest lepszy, bardziej smaczny w Pythonie sposób?

Odpowiedz

50

Jest to problem operatora priorytetowego.

Należy dodać dodatkowy nawias, aby swoją pracę wielu testów warunek:

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

This section samouczka pan wspomniał pokazuje przykład z kilku logicznych warunków i nawiasach są używane.

1

Tam może być jeszcze lepszy sposób, ale

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

prace.

+1

to działa, ale kończy się za pomocą operatorów python (zamiast numpy), a więc będzie znacznie wolniej – Jeff

+0

, to miłe rozwiązanie. Podoba mi się fakt, że wyraźnie używa "i". Uściśla, że ​​oceniane są dwa warunki. – LondonRob

+0

Och, właśnie znalazłem [duplikat] (http://stackoverflow.com/questions/8916302/selecting-across-multiple-columns-with-python-pandas) tego pytania. Whoops. – LondonRob

Powiązane problemy