我有一个数据框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)
最简单的方法是使用广播:
\njulia> 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\nRun Code Online (Sandbox Code Playgroud)\n如果您愿意,您也可以transform这样做:
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\nRun Code Online (Sandbox Code Playgroud)\n另外查看链接的 pandas 解决方案 DataFrames.jl 在这种情况下似乎更快:
\njulia> 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\nRun Code Online (Sandbox Code Playgroud)\n(在 pandas 的 2x3 数据帧中,其范围从 163 \xc2\xb5s 到 2.26 ms)
\n| 归档时间: |
|
| 查看次数: |
761 次 |
| 最近记录: |