У меня есть 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
Я добавил ответ - используйте names
в качестве селектора столбца в transform!
или более сложном вызове mapcols
.
Другой способ (возможно, менее эффективный):
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
(адаптированы из
Извините, это не тот ответ, который я ищу. Я изменил вопрос, чтобы сделать его более понятным. Я хочу изменить все столбцы определенного типа и оставить только столбцы, которые имеют другой тип.