2015-04-02 33 views
6

Tôi muốn chọn một tập con của một khung dữ liệu đáp ứng nhiều điều kiện trên nhiều hàng. Tôi biết tôi có thể tuần tự này - đầu tiên chọn tập hợp con khớp với điều kiện đầu tiên, sau đó là phần của những thứ khớp với thứ hai, v.v., nhưng có vẻ như nó có thể được thực hiện trong một bước duy nhất. Sau đây có vẻ như nó sẽ làm việc, nhưng không. Rõ ràng nó hoạt động như thế này trong việc triển khai DataFrame của các ngôn ngữ khác. Có suy nghĩ gì không?Chọn tập con của các hàng khung dữ liệu sử dụng nhiều điều kiện

using DataFrames 
df = DataFrame() 
df[:A]=[ 1, 3, 4, 7, 9] 
df[:B]=[ "a", "c", "c", "D", "c"] 
df[(df[:A].<5)&&(df[:B].=="c"),:] 

type: non-boolean (DataArray{Bool,1}) used in boolean context 
while loading In[18], in expression starting on line 5 

Trả lời

7

Đây là một điều Julia, không hẳn là một điều DataFrame: bạn muốn & thay vì &&. Ví dụ:

julia> [true, true] && [false, true] 
ERROR: TypeError: non-boolean (Array{Bool,1}) used in boolean context 

julia> [true, true] & [false, true] 
2-element Array{Bool,1}: 
false 
    true 

julia> df[(df[:A].<5)&(df[:B].=="c"),:] 
2x2 DataFrames.DataFrame 
| Row | A | B | 
|-----|---|-----| 
| 1 | 3 | "c" | 
| 2 | 4 | "c" | 

FWIW, này hoạt động theo cách tương tự ở gấu trúc bằng Python:

>>> df[(df.A < 5) & (df.B == "c")] 
    A B 
1 3 c 
2 4 c 
+0

Rất tiếc, tôi nên tự mình bắt gặp - tôi thậm chí còn xem xét các câu hỏi về gấu trúc có liên quan nhưng đã quá quen với việc nhập "&&" ... Cảm ơn! – ARM

+0

Điều này có thay đổi không? Hãy thử một cái gì đó tương tự tôi nhận được lỗi 'CẢNH BÁO: a :: DataArray {$ (Expr (: <:,: Integer))} & b :: DataArray {$ (Expr (: <:,: Integer))} không được chấp nhận, sử dụng &. (a, b) thay thế.' – jwimberley

0

Tôi có cùng bây giờ như https://stackoverflow.com/users/5526072/jwimberley, xảy ra trên bản cập nhật của tôi để julia 0.6 từ 0.5, và bây giờ sử dụng dataframes v 0.10.1.

Cập nhật: Tôi thực hiện thay đổi sau để khắc phục:

r[(r[:l] .== l) & (r[:w] .== w), :] # julia 0.5 

r[.&(r[:l] .== l, r[:w] .== w), :] # julia 0.6 

nhưng điều này trở nên rất chậm với chuỗi dài (thời gian thực hiện \ propto 2^chuỗi) như vậy có lẽ Query là cách tốt hơn bây giờ:

Ví dụ:
# r is a dataframe 
using Query 
q1 = @from i in r begin 
    @where i.l == l && i.w == w && i.nl == nl && i.lt == lt && 
    i.vz == vz && i.vw == vw && i.vδ == vδ && 
    i.ζx == ζx && i.ζy == ζy && i.ζδx == ζδx 
    @select {absu=i.absu, i.dBU} 
    @collect DataFrame 
end 

. Đây là nhanh. Nó nằm trong tài liệu DataFrames.

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