如何按条件子集Julia DataFrame,其中列缺少值

如何按条件子集Julia DataFrame,其中列缺少值,dataframe,conditional-statements,julia,subset,Dataframe,Conditional Statements,Julia,Subset,这似乎是一件非常简单的事情,但我无法做到 我在julia中有一个dataframedf,其中一列的类型为Array{Union{Missing,Int64},1} 该列中的值为:[缺失,1,2] 我只想将dataframedf子集,以便只查看对应于某个条件的行,例如列等于2的行 我尝试的-->结果: df[df[:col]。==2]-->方法错误:没有与getindex匹配的方法 df[df[:col]。==2,:]-->参数错误:Bool类型的行索引无效 df[df[:col]。==2,:co

这似乎是一件非常简单的事情,但我无法做到

我在julia中有一个dataframe
df
,其中一列的类型为
Array{Union{Missing,Int64},1}

该列中的值为:
[缺失,1,2]

我只想将dataframe
df
子集,以便只查看对应于某个条件的行,例如列等于2的行

我尝试的-->结果:

df[df[:col]。==2]
-->
方法错误:没有与getindex匹配的方法

df[df[:col]。==2,:]
-->
参数错误:Bool类型的行索引无效

df[df[:col]。==2,:col]
-->
边界错误:尝试访问字符串
(请注意,仅执行
df[!,:col]
将导致:
1339元素数组{Union{Missing,Int64},1}:[…eling output…]
,我最喜欢的警告是julia:
警告:getindex(df::DataFrame,col ind::ColumnIndex)已弃用,请改用df[!,col_ind]。
刚刚使用它似乎可以免除我的警告,但不管怎样。)

这不可能像看上去那么难

正如供参考的那样,我可以通过
使用Query
和多行sql查询来获得我想要的数据,这看起来……很麻烦。

如何进行行子集设置 有两种方法可以解决您的问题:

  • 使用
    isequal
    而不是
    ==
    ,因为
    ==
    实现了这一点,所以只需编写其中一个即可:
  • 如果要使用
    ==
    请在其上使用
    合并
    ,例如:
  • 它与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
    具有异构列元素类型,而Julia Base中的
    Matrix
    具有异构元素类型)

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

    实际上,您的示例
    df[df[:col]。==2]
    说明了为什么我们不允许一维索引。在
    df[:col]
    中,您尝试使用一维索引来子集,但在外部
    df[df[:col]。==2]
    中,您希望使用一维索引来子集

    从数据帧获取列的最简单方法是
    df.col
    df.col
    (如果列名称中有空格等字符,则通常使用第二种方法)。这样您就可以访问列
    :col
    ,而无需复制它。使用索引编写此选择的等效方法是
    df[!,:col]
    。如果要复制列,请写入
    df[:,:col]

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


    详细描述了为
    数据帧
    编制索引所允许的所有规则。此外,还将举办一个研讨会,会上将详细讨论DataFrames.jl中的索引设计(它是如何工作的,为什么以这种方式工作,以及它是如何在内部实现的)。

    非常感谢!这非常有用。对这些基本任务的简要解释将极大地帮助像我这样试图从Python中获得数据的科学家。感谢您的充分讨论!
    df[coalesce.(df.col .== 2, false), :] # new data frame
    
    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