2013-06-20 33 views
19

mặc dù có ít nhất twogood hướng dẫn về cách lập chỉ mục một DataFrame trong thư viện pandas của Python, tôi vẫn không thể thực hiện một cách thanh lịch SELECT ing trên nhiều cột.Trác thảo Python: Lập chỉ mục Boolean trên nhiều cột

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

Tôi đã tìm thấy (những gì tôi nghĩ là) một cách khá thanh nha để làm việc đó, như thế này

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

Nhưng nó không đẹp, và nó điểm khá thấp để có thể đọc (tôi nghĩ).

Có cách nào tốt hơn, Python-tastic hơn không?

Trả lời

50

Đây là vấn đề của nhà điều hành ưu tiên.

Bạn nên bổ sung thêm ngoặc để làm cho đa kiểm tra điều kiện làm việc của bạn:

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

This section của hướng dẫn bạn đề cập cho thấy một ví dụ với một số điều kiện boolean và ngoặc được sử dụng.

1

Vẫn có thể là một cách tốt hơn, nhưng

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

công trình.

+1

công trình này, nhưng kết thúc bằng cách sử dụng toán tử python (chứ không phải là gumpy) và vì vậy sẽ chậm hơn nhiều – Jeff

+0

đó là một giải pháp tốt đẹp. Tôi thích thực tế là nó sử dụng một cách rõ ràng 'và'. Làm cho nó rõ ràng hơn rằng có hai điều kiện được đánh giá. – LondonRob

+0

Ồ, tôi vừa tìm thấy [một bản sao] (http://stackoverflow.com/questions/8916302/selecting-across-multiple-columns-with-python-pandas) của câu hỏi này. Rất tiếc. – LondonRob

Các vấn đề liên quan