在 Julia 中转换特定类型的所有 DataFrame 列
Transform all DataFrame Columns of a specific Type in Julia
我有一个 DataFrame
有 Int64
列:
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
。其他类型的列应保持原样。
(您可能会从上面的示例中猜到,我喜欢 Chain
和 DataFramesMeta
的组合,但当然欢迎所有答案。)
最简单的方法是(这会更新您的原始数据框):
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
(改编自
我有一个 DataFrame
有 Int64
列:
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
。其他类型的列应保持原样。
(您可能会从上面的示例中猜到,我喜欢 Chain
和 DataFramesMeta
的组合,但当然欢迎所有答案。)
最简单的方法是(这会更新您的原始数据框):
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
(改编自