我想过滤列中的值并为过滤结果分配一个值。但是我得到了不正确的结果,在这种情况下,我想为 20 到 30 之间的值分配一个值,其余为 0。但我为所有值分配了 1。任何想法为什么?
df = DataFrame(
Dict(
"time" => collect(1:10),
"cost" => [23,99,81,56,28,31,98,34,21,17]
)
)
df.cat = missing
df.cat = ifelse.(df.cost .> 20 .& df.cost .< 30, 1,0)
Run Code Online (Sandbox Code Playgroud)
出去:
小智 5
问题是您需要在df.cost .> 20
和df.cost .< 30
部分周围加上括号:
julia> df = DataFrame(
Dict(
"time" => collect(1:10),
"cost" => [23,99,81,56,28,31,98,34,21,17]
)
);
julia> df.cat = ifelse.((df.cost .> 20) .& (df.cost .< 30), 1, 0);
julia> df
10×3 DataFrame
Row ? cost time cat
? Int64 Int64 Int64
???????????????????????????
1 ? 23 1 1
2 ? 99 2 0
3 ? 81 3 0
4 ? 56 4 0
5 ? 28 5 1
6 ? 31 6 0
7 ? 98 7 0
8 ? 34 8 0
9 ? 21 9 1
10 ? 17 10 0
Run Code Online (Sandbox Code Playgroud)
您遇到了运算符优先级问题。这是一个修复:
df.cat = ifelse.((df.cost .> 20) .& (df.cost .< 30), 1, 0)
Run Code Online (Sandbox Code Playgroud)
(注意条件周围的附加括号)
作为旁注,请考虑将 DataFrames.jl 升级到最新版本,很明显您不是在 0.22 版本上,因为df.cat = missing
操作已在 2 年前被弃用,目前我们更紧凑地打印数据帧以改善显示体验。