Преобразование всех столбцов DataFrame определенного типа в 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, но, конечно, все ответы более чем приветствуются.)

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
41
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Самый простой способ сделать это (это обновляет исходный фрейм данных):

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

Извините, это не тот ответ, который я ищу. Я изменил вопрос, чтобы сделать его более понятным. Я хочу изменить все столбцы определенного типа и оставить только столбцы, которые имеют другой тип.

Georgery 31.03.2022 21:57

Я добавил ответ - используйте names в качестве селектора столбца в transform! или более сложном вызове mapcols.

Bogumił Kamiński 31.03.2022 22:21

Другой способ (возможно, менее эффективный):

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

(адаптированы из

Другие вопросы по теме