在同一列中分配过滤值的结果不正确

ima*_*tha 3 dataframe julia

我想过滤列中的值并为过滤结果分配一个值。但是我得到了不正确的结果,在这种情况下,我想为 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 .> 20df.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)


Bog*_*ski 5

您遇到了运算符优先级问题。这是一个修复:

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 年前被弃用,目前我们更紧凑地打印数据帧以改善显示体验。