Dataframe 如何将数据帧相乘';使用julia在日志中创建的列?

Dataframe 如何将数据帧相乘';使用julia在日志中创建的列?,dataframe,julia,Dataframe,Julia,我有一个数据帧。我想将列“b”乘以一个“log”,然后用0s替换NaN 我怎么能在朱莉娅身上做到这一点? 我正在检查: 但我不明白 df = DataFrame(a = repeat([1, 2, 3, 4], outer=[2]), b = repeat([2, 1], outer=[4]), c = randn(8)) 我想用“log”乘以“b”列 假设您的意思是要将(自然)log应用于列:b中的每个元素,则可以执行以下操作: log.(df.

我有一个数据帧。我想将列“b”乘以一个“log”,然后用0s替换NaN

我怎么能在朱莉娅身上做到这一点? 我正在检查: 但我不明白

df = DataFrame(a = repeat([1, 2, 3, 4], outer=[2]),
           b = repeat([2, 1], outer=[4]),
           c = randn(8))

我想用“log”乘以“b”列

假设您的意思是要将(自然)
log
应用于列
:b
中的每个元素,则可以执行以下操作:

log.(df.b)

log(x)
将(自然)日志应用于单个元素
x
。通过在日志后添加一个点,您可以在每个元素上使用
log
函数

如果要替换列b,请执行以下操作:

df.b=log.(df.b)

然后用0替换NaN

我假设您希望处理出现
DomainError
(即取一个负数的
log
)的情况。最好是在错误出现之前处理它:

map(x->x使用生成器:

( v <= 0. ? 0. : log(v) for v in df.c )
df[!, :d] .= ( v <= 0. ? 0. : log(v) for v in df.c)
julia> using BenchmarkTools

julia> @btime $df[!, :d] .= ( v <= 0.0 ? 0.0 : log(v) for v in $df.c)
  1.440 μs (14 allocations: 720 bytes)

julia> @btime $df[!, :d] .= map( x -> x <= 0.0 ? 0.0 : log(x), $df.c);
  1.570 μs (14 allocations: 720 bytes)