Sav*_*nry 5 subset conditional-statements dataframe julia
这看起来应该是非常简单的事情,但我无法完成。
我df在 julia 中有一个数据框,其中一列的类型为Array{Union{Missing, Int64},1}。
该列中的值为:[missing, 1, 2]。
我只想对数据框进行子集化,df以查看与条件相对应的那些行,例如列等于 2 的位置。
我尝试过的 --> 结果:
df[df[:col].==2] --> MethodError: no method matching getindex
df[df[:col].==2, :] --> ArgumentError: invalid row index of type Bool
df[df[:col].==2, :col]--> BoundsError: attempt to access String(请注意,执行 just 会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代替==,因为==实现了三值逻辑。,所以只需编写其中之一即可: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
Run Code Online (Sandbox Code Playgroud)
==use coalesce,例如:df[coalesce.(df.col .== 2, false), :] # new data frame
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
(一般来说,您可以预期,在可能的情况下,DataFrames.jl 将与 Julia Base 一致工作;除了某些不可能的极端情况 - 主要区别来自于DataFrame具有异构列元素类型的事实,而Matrix在 Julia Base 中具有同质元素类型)
DataFrame是一个二维对象。它有行和列。在 Julia 中,通常,df[...]符号用于通过对象维度中的位置来访问对象。因此df[:col]不是索引到DataFrame. 您正在尝试使用一个索引维度,同时需要同时指定行索引和列索引。您收到警告,因为您使用了无效的索引方法(在 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]是一个有效的索引 ifi是一个整数或CartesianIndex。这样做df[i], where iis an integer 是不允许的,DataFrame因为如果我们想遵循 Julia Base 的约定(因为它与数组的存储模式有关,这与 for 不同DataFrame)被判断为对用户来说太混乱了. 你可以写df[i]when iis CartesianIndex(因为这是明确的)。我想这不是你要找的东西。
这里DataFrame详细描述了索引 a 允许的所有规则。在JuliaCon 2020期间还将举办一个研讨会,在此期间将详细讨论 DataFrames.jl 中的索引设计(它是如何工作的,为什么这样工作,以及它是如何在内部实现的)。