朱莉娅 数据帧选择属于集合的一列的基于行的值



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

使用以下示例

using DataFrames, DataFramesMeta
DT = DataFrame(ID = [1, 1, 2,2,3,3, 4,4], x1 = rand(8))

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

@where(DT, findall(x -> (x==4 || x==1), DT.ID))

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

但是,我想使其适用于具有许多行和大量值以供选择的 ID 的情况。因此,如果我需要写下要选择的所有值,则此解决方案是不现实

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

戴民

以下是使用标准 DataFrames.jl 索引和使用 DataFramesMeta.jl 中的@where的方法:

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 │

在非性能关键代码中,您也可以使用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 │

请注意,在问题中提到的方法中,您可以像这样省略DTID前面:

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 │

(这是DataFramesMeta.jl的一个美妙之处,它知道你想要引用的DataFrame的上下文(

最新更新