【发布时间】:2020-07-09 14:57:41
【问题描述】:
我想计算A列1,2,3,4的平方,用其他计算处理它存储在C列中
using CSV, DataFrames
df = DataFrame(A = 1:4, B = ["M", "F", "F", "M"])
df.C = ((((df.A./2).^2).*3.14)./1000)
有没有更简单的写法?
【问题讨论】:
标签: dataframe julia calculation
我想计算A列1,2,3,4的平方,用其他计算处理它存储在C列中
using CSV, DataFrames
df = DataFrame(A = 1:4, B = ["M", "F", "F", "M"])
df.C = ((((df.A./2).^2).*3.14)./1000)
有没有更简单的写法?
【问题讨论】:
标签: dataframe julia calculation
我不确定你希望公式能缩短多少,但你可以写:
df.C = @. (df.A / 2) ^ 2 * 3.14 / 1000
为了避免到处写.。
或者您可以使用transform!,但它不会更短(它的好处是您可以在处理管道中使用它,例如使用 Pipe.jl):
transform!(df, :A => ByRow(a -> (a / 2) ^ 2 * 3.14 / 1000) => :C)
【讨论】:
试试这个:
df.D = .5df.A .^2 * 0.00314
解释:
使用BenchmarkTools 的简单基准测试:
julia> @btime $df.E = .5*$df.A .^2 * 0.00314;
592.085 ns (9 allocations: 496 bytes)
julia> @btime $df.F = @. ($df.A / 2) ^ 2 * 0.00314;
875.490 ns (11 allocations: 448 bytes)
然而,最快的是更长的版本,您可以在其中提供类型信息 @. (df.A::Vector{Int} / 2) ^ 2 * 0.00314(同样,这很重要,而简称为 DataFrames 并注意这里必须存在 Z 列,因此我们在此处创建它):
julia> @btime begin $df.Z = Vector{Float64}(undef, nrow(df));@. $df.Z = ($df.A::Vector{Int} / 2.0) ^ 2.0 * 0.00314; end;
162.564 ns (3 allocations: 208 bytes)
【讨论】:
DataFrame的行数)对于短向量代数乘法更快。收支平衡约为 100 行。我编辑了答案。