dataframe - 如何按条件对 Julia DataFrame 进行子集化,其中列有缺失值

标签 dataframe conditional-statements julia subset

这看起来应该是非常简单的事情,但我无法完成。

我有一个数据框 df在 Julia 中,其中一列的类型为 Array{Union{Missing, Int64},1} .

该列中的值为:[missing, 1, 2] .

我只想对数据帧进行子集化 df只查看与条件对应的那些行,例如列等于 2 的位置。

我尝试过的 --> 结果:
df[df[:col].==2] --> MethodError: no method matching getindexdf[df[:col].==2, :] --> ArgumentError: invalid row index of type Booldf[df[:col].==2, :col] --> BoundsError: attempt to access String (请注意,仅执行 df[!, :col] 结果: 1339-element Array{Union{Missing, Int64},1}: [...eliding output...] ,到目前为止我在 julia 中最喜欢的警告: Warning: getindex(df::DataFrame, col_ind::ColumnIndex) is deprecated, use df[!, col_ind] instead. 刚刚使用它似乎使我免受警告,但无论如何。)

这不可能像看起来那么难。

就像仅供引用,我可以通过using Query得到我想要的东西并进行多行 sql 查询只是为了对数据进行子集化,这似乎......很繁重。

最佳答案

如何进行行子集

有两种方法可以解决您的问题:

  • 使用 isequal 而不是 == ,因为 == 实现了 3-valued logic .,所以只写一个就行了:
  • df[isequal.(df.col,2), :] # new data frame
    filter(:col => isequal(2), df) # new data frame
    filter!(:col => isequal(2), df) # update old data frame in place
    
  • 如果你想使用 == 在它上面使用 coalesce,例如:
  • df[coalesce.(df.col .== 2, false), :] # new data frame
    

    DataFrames.jl 没有什么特别之处。索引在 Julia Base 中的工作方式相同:
    julia> x = [1, 2, missing]
    3-element Array{Union{Missing, Int64},1}:
     1
     2
      missing
    
    julia> x[x .== 2]
    ERROR: ArgumentError: unable to check bounds for indices of type Missing
    
    julia> x[isequal.(x, 2)]
    1-element Array{Union{Missing, Int64},1}:
     2
    

    (一般来说,您可以预期,在可能的情况下,DataFrames.jl 将与 Julia Base 一致工作;除了一些不可能的极端情况 - 主要区别在于 DataFrame 具有异构列元素类型,而 Matrix 在 Julia 中基具有同质元素类型)

    如何做索引
    DataFrame 是一个二维对象。它有行和列。在 Julia 中,通常使用 df[...] 表示法通过对象维度中的位置访问对象。因此 df[:col] 不是索引到 DataFrame 的有效方法。您正在尝试使用一个索引维度,同时需要同时指定行索引和列索引。您收到警告,因为您使用了无效的索引方法(在 DataFrames.jl 的下一个版本中,此警告将消失,您只会收到错误)。

    实际上,您的示例 df[df[:col].==2] 显示了为什么我们不允许单维索引。在 df[:col] 中,您尝试使用单维索引对 进行子集化,但在外部 df[df[:col].==2] 中,您希望使用单维索引对 行进行子集化。

    从数据框中获取列的最简单方法是 df.coldf."col"(如果列名称中有空格等字符,通常使用第二种方法)。通过这种方式,您无需复制即可访问列 :col。使用索引编写此选择的等效方法是 df[!, :col] 。如果你想复制列写 df[:, :col]

    旁注 - 更高级的索引

    事实上,在 Julia Base 中,如果 a 是一个数组(任何维度),那么 a[i] 是一个有效索引,如果 i 是一个整数或 CartesianIndex 。做 df[i] ,其中 i 是整数,DataFrame 是不允许的,因为如果我们想遵循 Julia Base 的约定(因为它与不相同的数组的存储模式有关),人们认为这对用户来说太困惑了至于 DataFrame )。当 df[i]i 时,您可以写入 CartesianIndex(因为这是明确的)。我想这不是你要找的东西。

    所有允许索引 DataFrame 的规则都在 here 中详细描述。同样在 JuliaCon 2020 期间,将有一个研讨会,在此期间将详细讨论 DataFrames.jl 中的索引设计(它是如何工作的,为什么以这种方式工作,以及它是如何在内部实现的)。

    关于dataframe - 如何按条件对 Julia DataFrame 进行子集化,其中列有缺失值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62399740/

    相关文章:

    Julia:在函数内解包参数的最佳实践

    python - 如何从列表列表中删除符合特定条件的所有元素?

    python - 将数据框转换为包含字典列表的字典

    couchdb - CouchDB 是否支持多范围查询?

    php - 为什么我的条件回显是错误的

    ascii - 在 Julia 中,如何将 ASCII 十进制列表转换为字符串?

    type-conversion - 在 Julia 中绘制 ForwardDiff 的输出

    python - 从特定索引向数据框添加新值?

    r - 为什么 apply 将数据帧中的逻辑转换为 5 个字符的字符串?

    r - 在 R 中按排名和条件提取行