2015-04-02 2 views
6

Я хотел бы выбрать подмножество кадра данных, которое удовлетворяет нескольким условиям для нескольких строк. Я знаю, что могу это сделать последовательно: сначала выберите подмножество, соответствующее первому условию, затем часть тех, которые соответствуют второму, и т. Д., Но похоже, что он должен быть выполнен за один шаг. Кажется, что это должно сработать, но нет. По-видимому, он работает так, как в реализациях других языков DataFrame. Есть предположения?Выберите подмножество строк данных с использованием нескольких условий

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 

ответ

7

Это Джулия вещь, не так много DataFrame вещь: вы хотите & вместо &&. Например:

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, это работает так же, как в панд в Python:

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

Ой, я должен был это понять сам - я даже посмотрел на связанные вопросы панд, но был слишком привык печатать «&&» ... Спасибо! – ARM

+0

Это изменилось? При попытке чего-то подобного я получаю ошибку 'WARNING: a :: DataArray {$ (Expr (: <:,: Integer))} & b :: DataArray {$ (Expr (: <:,: Integer))} устарел, вместо этого используйте &. (a, b). – jwimberley

0

меня же теперь, как https://stackoverflow.com/users/5526072/jwimberley, происходящий на моем обновлении Джулии 0,6 от 0,5, а теперь с помощью dataframes v 0.10.1.

Обновление: Я сделал следующие изменения, чтобы исправить:

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

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

, но это становится очень медленно с длинными цепями (время принятых \ propto 2^цепи) поэтому, возможно, запрос является лучшим способом в настоящее время:

# 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 

например. Это быстро. Он находится в документации DataFrames.

Смежные вопросы