2013-06-20 3 views
19

несмотря на наличие, по крайней мере twogood учебники о том, как индексировать DataFrame в pandas библиотеке Python, я до сих пор не может выработать элегантный способ SELECT ИНГ на более чем один столбец.Python Панды: Boolean индексирование на несколько столбцов

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

Я нашел (что я думаю) довольно безвкусный способ сделать это, как этот

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

Но это не красиво, и она набирает довольно низкие для читаемости (я думаю).

Есть ли лучший, более простой способ Python-tastic?

ответ

50

Это проблема с приоритетом оператора.

Вы должны добавить дополнительные скобки, чтобы сделать ваше мульти состояния работы по тестированию:

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

This section учебника вы упомянули показывает пример с несколькими логических условиями и круглыми скобками используется.

1

Там все еще может быть лучше, но

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

работы.

+1

это работает, но заканчивается использованием операторов python (а не numpy), и поэтому будет намного медленнее – Jeff

+0

, это приятное решение. Мне нравится, что он явно использует 'и'. Уточняет, что оцениваются два условия. – LondonRob

+0

О, я только что нашел [дубликат] (http://stackoverflow.com/questions/8916302/selecting-across-multiple-columns-with-python-pandas) этого вопроса. Упс. – LondonRob