数据框所有列的转换函数

pp4*_*492 2 dataframe julia

我有一个数据框df,我正在尝试对每个单元格应用一个函数。根据文档我应该使用该transform功能。

该函数应该应用于每一列,因此我用作[:]所有列的选择器

transform(
    df, [:] .=> ByRow(x -> (if (x > 1) x else zero(Float64) end)) .=> [:]
)
Run Code Online (Sandbox Code Playgroud)

但它产生了一个异常

ArgumentError: Unrecognized column selector: Colon() => (DataFrames.ByRow{Main.workspace293.var"#1#2"}(Main.workspace293.var"#1#2"()) => Colon())
Run Code Online (Sandbox Code Playgroud)

虽然当我使用单列时,它工作得很好

transform(
    df, [:K0] .=> ByRow(x -> (if (x > 1) x else zero(Float64) end)) .=> [:K0]
)
Run Code Online (Sandbox Code Playgroud)

Bog*_*ski 6

最简单的方法是使用广播:

\n
julia> df = DataFrame(2*rand(4,3), [:x1, :x2, :x3])\n4\xc3\x973 DataFrame\n\xe2\x94\x82 Row \xe2\x94\x82 x1        \xe2\x94\x82 x2       \xe2\x94\x82 x3       \xe2\x94\x82\n\xe2\x94\x82     \xe2\x94\x82 Float64   \xe2\x94\x82 Float64  \xe2\x94\x82 Float64  \xe2\x94\x82\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xbc\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xbc\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xbc\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xa4\n\xe2\x94\x82 1   \xe2\x94\x82 0.945879  \xe2\x94\x82 1.59742  \xe2\x94\x82 0.882428 \xe2\x94\x82\n\xe2\x94\x82 2   \xe2\x94\x82 0.0963367 \xe2\x94\x82 0.400404 \xe2\x94\x82 0.599865 \xe2\x94\x82\n\xe2\x94\x82 3   \xe2\x94\x82 1.23356   \xe2\x94\x82 0.807691 \xe2\x94\x82 0.547917 \xe2\x94\x82\n\xe2\x94\x82 4   \xe2\x94\x82 0.756098  \xe2\x94\x82 0.595673 \xe2\x94\x82 0.29678  \xe2\x94\x82\n\njulia> @. ifelse(df > 1, df, 0.0)\n4\xc3\x973 DataFrame\n\xe2\x94\x82 Row \xe2\x94\x82 x1      \xe2\x94\x82 x2      \xe2\x94\x82 x3      \xe2\x94\x82\n\xe2\x94\x82     \xe2\x94\x82 Float64 \xe2\x94\x82 Float64 \xe2\x94\x82 Float64 \xe2\x94\x82\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xbc\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xbc\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xbc\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xa4\n\xe2\x94\x82 1   \xe2\x94\x82 0.0     \xe2\x94\x82 1.59742 \xe2\x94\x82 0.0     \xe2\x94\x82\n\xe2\x94\x82 2   \xe2\x94\x82 0.0     \xe2\x94\x82 0.0     \xe2\x94\x82 0.0     \xe2\x94\x82\n\xe2\x94\x82 3   \xe2\x94\x82 1.23356 \xe2\x94\x82 0.0     \xe2\x94\x82 0.0     \xe2\x94\x82\n\xe2\x94\x82 4   \xe2\x94\x82 0.0     \xe2\x94\x82 0.0     \xe2\x94\x82 0.0     \xe2\x94\x82\n
Run Code Online (Sandbox Code Playgroud)\n

如果您愿意,您也可以transform这样做:

\n
julia> transform(df, names(df) .=> ByRow(x -> ifelse(x>1, x, 0.0)) .=> names(df))\n4\xc3\x973 DataFrame\n\xe2\x94\x82 Row \xe2\x94\x82 x1      \xe2\x94\x82 x2      \xe2\x94\x82 x3      \xe2\x94\x82\n\xe2\x94\x82     \xe2\x94\x82 Float64 \xe2\x94\x82 Float64 \xe2\x94\x82 Float64 \xe2\x94\x82\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xbc\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xbc\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xbc\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xa4\n\xe2\x94\x82 1   \xe2\x94\x82 0.0     \xe2\x94\x82 1.59742 \xe2\x94\x82 0.0     \xe2\x94\x82\n\xe2\x94\x82 2   \xe2\x94\x82 0.0     \xe2\x94\x82 0.0     \xe2\x94\x82 0.0     \xe2\x94\x82\n\xe2\x94\x82 3   \xe2\x94\x82 1.23356 \xe2\x94\x82 0.0     \xe2\x94\x82 0.0     \xe2\x94\x82\n\xe2\x94\x82 4   \xe2\x94\x82 0.0     \xe2\x94\x82 0.0     \xe2\x94\x82 0.0     \xe2\x94\x82\n
Run Code Online (Sandbox Code Playgroud)\n

另外查看链接的 pandas 解决方案 DataFrames.jl 在这种情况下似乎更快:

\n
julia> df = DataFrame(2*rand(2,3), [:x1, :x2, :x3])\n2\xc3\x973 DataFrame\n Row \xe2\x94\x82 x1       x2       x3       \n     \xe2\x94\x82 Float64  Float64  Float64  \n\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xbc\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\n   1 \xe2\x94\x82 1.48781  1.20332  1.08071\n   2 \xe2\x94\x82 1.55462  1.66393  0.363993\n\njulia> using BenchmarkTools\n\njulia> @btime @. ifelse($df > 1, $df, 0.0)\n  6.252 \xce\xbcs (58 allocations: 3.89 KiB)\n2\xc3\x973 DataFrame\n Row \xe2\x94\x82 x1       x2       x3      \n     \xe2\x94\x82 Float64  Float64  Float64 \n\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xbc\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\n   1 \xe2\x94\x82 1.48781  1.20332  1.08071\n   2 \xe2\x94\x82 1.55462  1.66393  0.0\n
Run Code Online (Sandbox Code Playgroud)\n

(在 pandas 的 2x3 数据帧中,其范围从 163 \xc2\xb5s 到 2.26 ms)

\n