dataframe - 使用列选择器 (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 All
can be used intransform
等,但我得到了这个错误。
感谢您的任何指示。
解决方案
这些选择器可以在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了解它现在的工作原理。
推荐阅读
- python - 烧瓶根据其他表的ID添加一个新行
- javascript - CSP:拒绝执行内联脚本
- php - 如何使用 PhpUnit 使用 Laravel 测试服务?
- python - 如何通过傅里叶变换获得有关图像清晰度的信息?
- python - 为什么Python的turtle模块中的back()函数不能正常工作?
- php - 使用 AJAX 请求上传文件时出现错误 net :: ERR_CONNECTION_RESET。有什么解决办法吗?
- python - 如何获得多行输入?
- linker - 同时使用两个不同的 libcs
- excel - 从 excel 用户表单更新数据库记录
- redis - 找出在 PCF DEV 中运行的 Redis 版本