索引 Julia DataFrame 时感叹号的含义是什么?

11 julia

我认为感叹号!是逻辑NOT运算符的符号。现在,在学习DataFrames包中的索引时,我遇到了这个:data[!,:Treatment]. 这似乎与使用已知的冒号符号相同:

data[:,:Treatment]==data[!,:Treatment]true

为什么会有这种冗余呢?

fre*_*kre 12

!in 索引特定于DataFrames, 并表示您想要对存储数据的底层向量的引用,而不是它的副本。您可以DataFrames 在此处阅读有关索引的所有信息。在您的示例中,两者都是==因为所有值都相同,但它们不是===因为df[:, :Treatment]为您提供了基础数据的副本。

例子:

julia> using DataFrames

julia> df = DataFrame(y = [1, 2, 3]);

julia> df[:, :y] == df[!, :y] # true because all values are equal
true

julia> df[:, :y] === df[!, :y] # false because they are not the same vector
false
Run Code Online (Sandbox Code Playgroud)

  • 您可以将数据帧(或多或少)视为包含向量的“结构”——每列一个。`df[!, :y]` 与 `df.y` 是相同的向量,这意味着两个向量都指向同一块内存。 (3认同)

ffe*_*tte 9

引用DataFrames.jl的文档:

可以通过df.col或直接(即无需复制)访问列df[!, :col]。[...] 由于df[!, :col]不进行复制,因此更改此语法返回的列向量的元素将影响存储在原始df. 要获取列的副本,请使用df[:, :col]:更改此语法返回的向量不会更改df

一个例子可能会更清楚地说明这一点:

julia> using DataFrames

julia> df = DataFrame(x = rand(5), y=rand(5))
5×2 DataFrame
? Row ? x        ? y         ?
?     ? Float64  ? Float64   ?
??????????????????????????????
? 1   ? 0.937892 ? 0.42232   ?
? 2   ? 0.54413  ? 0.932265  ?
? 3   ? 0.961372 ? 0.680818  ?
? 4   ? 0.958788 ? 0.923667  ?
? 5   ? 0.942518 ? 0.0428454 ?
Run Code Online (Sandbox Code Playgroud)
# `a` is a copy of `df.x`: modifying it will not affect `df`
julia> a = df[:, :x]
5-element Array{Float64,1}:
 0.9378915597741728
 0.544130347207969
 0.9613717853719412
 0.958788066884128
 0.9425183324742632

julia> a[2] = 1;

julia> df
5×2 DataFrame
? Row ? x        ? y         ?
?     ? Float64  ? Float64   ?
??????????????????????????????
? 1   ? 0.937892 ? 0.42232   ?
? 2   ? 0.54413  ? 0.932265  ?
? 3   ? 0.961372 ? 0.680818  ?
? 4   ? 0.958788 ? 0.923667  ?
? 5   ? 0.942518 ? 0.0428454 ?
Run Code Online (Sandbox Code Playgroud)
# `b` is a view of `df.x`: any change made to it will be reflected in df
julia> b = df[!, :x]
5-element Array{Float64,1}:
 0.9378915597741728
 0.544130347207969
 0.9613717853719412
 0.958788066884128
 0.9425183324742632

julia> b[2] = 1;

julia> df
5×2 DataFrame
? Row ? x        ? y         ?
?     ? Float64  ? Float64   ?
??????????????????????????????
? 1   ? 0.937892 ? 0.42232   ?
? 2   ? 1.0      ? 0.932265  ?
? 3   ? 0.961372 ? 0.680818  ?
? 4   ? 0.958788 ? 0.923667  ?
? 5   ? 0.942518 ? 0.0428454 ?
Run Code Online (Sandbox Code Playgroud)


请注意,由于索引与!不涉及任何数据复制,因此通常会更有效。