Dataframe 在Julia中转换数据帧的多列的正确方法是什么?

Dataframe 在Julia中转换数据帧的多列的正确方法是什么?,dataframe,julia,Dataframe,Julia,如何将函数应用于某些列的每个元素 julia> using DataFrames julia> df = DataFrame(Time = [3, 4, 5], TopTemp = [70, 73, 100], BottomTemp = [50, 55, 80]) 3×3 DataFrame Row │ Time TopTemp BottomTemp │ Int64 Int64 Int64 ─────┼────────────────────

如何将函数应用于某些列的每个元素

julia> using DataFrames

julia> df = DataFrame(Time = [3, 4, 5], TopTemp = [70, 73, 100], BottomTemp = [50, 55, 80])
3×3 DataFrame
 Row │ Time   TopTemp  BottomTemp 
     │ Int64  Int64    Int64      
─────┼────────────────────────────
   1 │     3       70          50
   2 │     4       73          55
   3 │     5      100          80

julia> fahrenheit_to_celsius(x) = Int(round((x - 32) * 5 / 9))
fahrenheit_to_celsius (generic function with 1 method)
这对一个专栏有效,但我不确定这是最好的方法

julia> transform!(df, "TopTemp" => ByRow(fahrenheit_to_celsius), renamecols = false)
3×3 DataFrame
 Row │ Time   TopTemp  BottomTemp 
     │ Int64  Int64    Int64      
─────┼────────────────────────────
   1 │     3       21          50
   2 │     4       23          55
   3 │     5       38          80
使用带有广播的正则表达式转换两个列时,相同的方法不起作用

julia> transform!(df, r"Temp" .=> ByRow.(fahrenheit_to_celsius), renamecols = false)
ERROR: LoadError: MethodError: no method matching fahrenheit_to_celsius(::Int64, ::Int64)
使用:

还请注意,它不在适当的位置,但在上述两种情况下,列都会被替换,但这可能是您通常想要的

就地操作将是:

df[:, r"Temp"] .= fahrenheit_to_celsius.(df[!, r"Temp"])
但如果
fahrenheit_to_cercifics
更改列的
eltype
,则它将失败

最快的应该是:

foreach(col -> col .= fahrenheit_to_celsius.(col), eachcol(df[!, r"Temp"])))

所有速度都相似吗?如果数据帧较大,它们应该相似。所有情况下的核心操作都是以相同的方式执行的。如果数据帧很小,但您执行此操作数百万次,那么广播可能会更快一些,因为它需要更少的内部逻辑。如果你想超快,还有另一个解决方案——我已经将它添加到列表中。
df[:, r"Temp"] .= fahrenheit_to_celsius.(df[!, r"Temp"])
foreach(col -> col .= fahrenheit_to_celsius.(col), eachcol(df[!, r"Temp"])))