DataFrames.jl - 按类型或名称子字符串选择列

3

我希望你能帮忙翻译一下,涉及 IT 技术相关内容。需要在 DataFrames.jl 中选择给定类型的所有变量或具有给定子字符串名称的所有变量。例如,在 R 中我们可以使用以下代码:

df %>% select_if(is.numeric)

df %>% select(matches("_some_string_"))


谢谢。
2个回答

8

使用以下方法选择包含指定子字符串的变量:

select(df, r"_some_string_")

实际上,它比子字符串强大得多 - 它可以是任何Regex

对于选择给定元素类型的变量,这更加棘手。问题在于在 Julia 中,您比在 R 中具有更大的灵活性。例如,您可以有Any类型的eltype,但向量仍仅包含数字。

因此,您可以编写以下内容:

select(df, findall(col -> eltype(col) <: Float64, eachcol(df)))

当然,在这里限制非常严格,你可以将 Float64 更改为像 RealNumber 或者 Union{Missing, Int} 这样的选项,具体要根据您想选择的内容来决定。

select(df, findall(col -> all(v -> v isa Float64, col), eachcol(df)))

这一次你检查的不是容器元素的类型,而是存储值的实际类型。

下面是一个快速示例来说明它们之间的区别:

julia> df = DataFrame(a=[1.0], b=Any[1.0], c=[1])
1×3 DataFrame
│ Row │ a       │ b   │ c     │
│     │ Float64AnyInt64 │
├─────┼─────────┼─────┼───────┤
│ 11.01.01     │

julia> select(df, findall(col -> eltype(col) <: Float64, eachcol(df)))
1×1 DataFrame
│ Row │ a       │
│     │ Float64 │
├─────┼─────────┤
│ 11.0     │

julia> select(df, findall(col -> all(v -> v isa Float64, col), eachcol(df)))
1×2 DataFrame
│ Row │ a       │ b   │
│     │ Float64Any │
├─────┼─────────┼─────┤
│ 11.01.0

可以使用nonmissingtype(eltype(col))来获取列类型的T部分,如果它是一个Union{Missing,T} - BallpointBen

0
另一种选择使用 Colscontains 来选择包含特定子字符串的列。以下是一些可复现的代码:
julia> using DataFrames

julia> df = DataFrame(col1 = 1, col2 = 2, col3 = 3)
1×3 DataFrame
 Row │ col1   col2   col3  
     │ Int64  Int64  Int64 
─────┼─────────────────────
   11      2      3

julia> select(df, Cols(contains.("2")))
1×1 DataFrame
 Row │ col2  
     │ Int64 
─────┼───────
   12

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接