在 Julia 中转换特定类型的所有 DataFrame 列

Transform all DataFrame Columns of a specific Type in Julia

我有一个 DataFrameInt64 列:

using DataFrames
df = DataFrame(a=1:3,b=4:6,c=["a","b","c"])

3×2 DataFrame
 Row │ a      b      c
     │ Int64  Int64  String
─────┼──────────────────────
   1 │     1      4    a
   2 │     2      5    b
   3 │     3      6    c

现在,我想将列类型更改为 Float64。我知道我可以做类似...

using DataFramesMeta, Chain

@chain df begin
    @transform!(:a = Float64.(:a),
                :b = Float64.(:b))
end

df.a = Float64.(df.a)
df.b = Float64.(df.b)

但是我怎样才能将类型为 Int64 的所有列更改为 Float64。其他类型的列应保持原样。

(您可能会从上面的示例中猜到,我喜欢 ChainDataFramesMeta 的组合,但当然欢迎所有答案。)

最简单的方法是(这会更新您的原始数据框):

df .= Float64.(df)

使用 transform! 你也可以这样做:

transform!(df, All() .=> ByRow(Float64), renamecols=false)

或者你也可以这样做:

mapcols!(ByRow(Float64), df)

(抱歉 - 此处还没有 DataFramesMeta.jl - 但未来可能会发生变化)


如果您只想更改,例如具有 Int 类型的列然后执行:

julia> transform!(df, names(df, Int) .=> ByRow(Float64), renamecols=false)
3×3 DataFrame
 Row │ a        b        c
     │ Float64  Float64  String
─────┼──────────────────────────
   1 │     1.0      4.0  a
   2 │     2.0      5.0  b
   3 │     3.0      6.0  c

mapcols(df) do col
    eltype(col) === Int ? Float64.(col) : col
end

另一种方式(可能效率较低):

julia> using DataFrames

julia> df = DataFrame(a=1:3,b=4:6,c=["a","b","c"])
3×3 DataFrame
 Row │ a      b      c      
     │ Int64  Int64  String 
─────┼──────────────────────
   1 │     1      4  a
   2 │     2      5  b
   3 │     3      6  c

julia> [df[!,col] = convert(Vector{Float64},df[!,col]) for col in names(df) if eltype(df[!,col]) <: Integer]
2-element Vector{Vector{Float64}}:
 [1.0, 2.0, 3.0]
 [4.0, 5.0, 6.0]

julia> df    
3×3 DataFrame
 Row │ a        b        c      
     │ Float64  Float64  String 
─────┼──────────────────────────
   1 │     1.0      4.0  a
   2 │     2.0      5.0  b
   3 │     3.0      6.0  c

(改编自