2016-01-17 2 views
4

Есть два способа фильтрации DataFrame в случае ниже:Юлия DataFrame несколько значений фильтрации

1. df = df[((df[:field].==1) | (df[:field].==2)), :] 
2. df = df[[in(v, [1, 2]) for v in df[:field]], :] 

Второй подход медленнее, но он подходит для изменяемого набора значений в состоянии. Есть ли какой-либо синтаксический сахар, который я пропустил, поэтому я могу получить его так же быстро, как 1-й способ, но с некоторой конструкцией типа in?

ответ

3
julia> using DataFrames 

findin функция может быть другой способ сделать задачу:

julia> function t_findin(df::DataFrames.DataFrame) 
     df[findin(df[:A],[1,2]), :] 
     end 
t3 (generic function with 1 method) 

массив постижений:

julia> function t_compr(df::DataFrames.DataFrame) 
     df[[in(v, [1, 2]) for v in df[:A]], :] 
     end 
t1 (generic function with 1 method) 

несколько conditionds:

julia> function t_mconds(df::DataFrames.DataFrame) 
     df[((df[:A].==1) | (df[:A].==2)), :] 
     end 
t2 (generic function with 1 method) 

Тестовые данные

julia> df[:B] = rand(1:30,10_000_000); 
julia> df[:A] = rand(1:30,10_000_000); 

Тест Результаты

julia> @time t_findin(df); 
    0.489064 seconds (67 allocations: 19.340 MB, 0.49% gc time) 

julia> @time t_mconds(df); 
    0.222389 seconds (106 allocations: 78.933 MB, 5.98% gc time) 

julia> @time t_compr(df); 
23.634846 seconds (100.00 M allocations: 2.563 GB, 1.47% gc time) 
+0

Удивительный! Спасибо! – iw2rmb

+0

Ознакомьтесь с текущей дискуссией по адресу DataFramesMeta 39: https://github.com/JuliaStats/DataFramesMeta.jl/issues/39 – SalchiPapa

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