julia DataFrame 选择属于一组的一列的基于行的值

djo*_*rd1 5 select rows dataframe julia

在 Julia 中使用 DataFrame,我想根据列中的值选择行。

用下面的例子

using DataFrames, DataFramesMeta
DT = DataFrame(ID = [1, 1, 2,2,3,3, 4,4], x1 = rand(8))
Run Code Online (Sandbox Code Playgroud)

我想提取 ID 取值为 1 和 4 的行。目前,我提出了该解决方案。

@where(DT, findall(x -> (x==4 || x==1), DT.ID))
Run Code Online (Sandbox Code Playgroud)

当仅使用两个值时,它是可管理的。

但是,我想让它适用于要选择的 ID 具有多行和大量值的情况。因此,如果我需要写下所有要选择的值,这个解决方案是不切实际的

有什么更好的解决方案可以使这个选择通用?

达米安

Bog*_*ski 6

这是使用标准 DataFrames.jl 索引并使用@where来自 DataFramesMeta.jl 的方法:

julia> DT
8×2 DataFrame
? Row ? ID    ? x1        ?
?     ? Int64 ? Float64   ?
???????????????????????????
? 1   ? 1     ? 0.433397  ?
? 2   ? 1     ? 0.963775  ?
? 3   ? 2     ? 0.365919  ?
? 4   ? 2     ? 0.325169  ?
? 5   ? 3     ? 0.0495252 ?
? 6   ? 3     ? 0.637568  ?
? 7   ? 4     ? 0.391051  ?
? 8   ? 4     ? 0.436209  ?

julia> DT[in([1,4]).(DT.ID), :]
4×2 DataFrame
? Row ? ID    ? x1       ?
?     ? Int64 ? Float64  ?
??????????????????????????
? 1   ? 1     ? 0.433397 ?
? 2   ? 1     ? 0.963775 ?
? 3   ? 4     ? 0.391051 ?
? 4   ? 4     ? 0.436209 ?

julia> @where(DT, in([1,4]).(:ID))
4×2 DataFrame
? Row ? ID    ? x1       ?
?     ? Int64 ? Float64  ?
??????????????????????????
? 1   ? 1     ? 0.433397 ?
? 2   ? 1     ? 0.963775 ?
? 3   ? 4     ? 0.391051 ?
? 4   ? 4     ? 0.436209 ?
Run Code Online (Sandbox Code Playgroud)

在非性能关键代码中,您也可以使用filter,这至少对我来说更容易消化(但它有一个缺点,它比上面讨论的方法慢):

julia> filter(row -> row.ID in [1,4], DT)
4×2 DataFrame
? Row ? ID    ? x1       ?
?     ? Int64 ? Float64  ?
??????????????????????????
? 1   ? 1     ? 0.433397 ?
? 2   ? 1     ? 0.963775 ?
? 3   ? 4     ? 0.391051 ?
? 4   ? 4     ? 0.436209 ?
Run Code Online (Sandbox Code Playgroud)

请注意,在您在问题中提到的方法中,您可以像这样省略DT前面的内容ID

julia> @where(DT, findall(x -> (x==4 || x==1), :ID))
4×2 DataFrame
? Row ? ID    ? x1       ?
?     ? Int64 ? Float64  ?
??????????????????????????
? 1   ? 1     ? 0.433397 ?
? 2   ? 1     ? 0.963775 ?
? 3   ? 4     ? 0.391051 ?
? 4   ? 4     ? 0.436209 ?
Run Code Online (Sandbox Code Playgroud)

(这是 DataFramesMeta.jl 的一个优点,它知道DataFrame您要引用的上下文)