首页 > 解决方案 > 使用列选择器 (Cols) 转换数据框列失败

问题描述

我想知道为什么我不能使用Cols列选择器transform来更改数据框列。例如:

df = DataFrame(x = 1:5, y = 6:10)
transform(df, [:x, :y] .=> v -> v .+ 100)    # OK
df[!, Cols(1:2)] .= df[!, Cols(1:2)] .+ 100  # OK

transform(df, Cols(1:2) .=> v -> v .+ 100)   # MethodError: no method matching length(::Cols{Tuple{UnitRange{Int64}}})

我在DataFrames文档中读到了列选择器,例如Cols, Between, Not, and Allcan be used intransform等,但我得到了这个错误。

感谢您的任何指示。

标签: dataframejulia

解决方案


这些选择器可以在transform直接传递给时使用。在这里,您正在使用广播.=>(注意点),因此您没有将它们直接传递给transform,而是尝试传递以下内容:

julia> Cols(1:2) .=> v -> v .+ 100
ERROR: MethodError: no method matching length(::Cols{Tuple{UnitRange{Int64}}})

您观察到的错误不是由 DataFrames.jl 发出的,而是由 Julia base 发出的。

您需要做的是使用names来使事情起作用:

julia> names(df, Cols(1:2)) .=> v -> v .+ 100
2-element Vector{Pair{String, var"#7#8"}}:
 "x" => var"#7#8"()
 "y" => var"#7#8"()

因此,以下工作:

 transform(df, names(df, Cols(1:2)) .=> v -> v .+ 100)

将来可能会添加您请求的功能,但需要在 DataAPI.jl 中进行更改,请参见此处


编辑

正如 DataFrames.jl 1.3 中的原始答案所示,该功能已添加,现在您可以毫无错误地进行操作transform(df, Cols(1:2) .=> v -> v .+ 100)。请参阅https://bkamins.github.io/julialang/2021/12/17/selectors.html了解它现在的工作原理。


推荐阅读