如何按条件子集Julia DataFrame,其中列缺少值
这似乎是一件非常简单的事情,但我无法做到 我在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
df
,其中一列的类型为Array{Union{Missing,Int64},1}
该列中的值为:[缺失,1,2]
我只想将dataframedf
子集,以便只查看对应于某个条件的行,例如列等于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