dataframe所有列上的transform函数

dataframe所有列上的transform函数,dataframe,julia,Dataframe,Julia,我有一个数据帧df,我试图对每个单元格应用一个函数。根据需要,我应该使用转换功能 该函数应该应用于每个列,因此我使用[:]作为所有列的选择器 transform( df, [:] .=> ByRow(x -> (if (x > 1) x else zero(Float64) end)) .=> [:] ) 但它产生了一个例外 ArgumentError: Unrecognized column selector: Colon() => (DataFrame

我有一个数据帧
df
,我试图对每个单元格应用一个函数。根据需要,我应该使用
转换
功能

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

transform(
    df, [:] .=> ByRow(x -> (if (x > 1) x else zero(Float64) end)) .=> [:]
)
但它产生了一个例外

ArgumentError: Unrecognized column selector: Colon() => (DataFrames.ByRow{Main.workspace293.var"#1#2"}(Main.workspace293.var"#1#2"()) => Colon())
虽然当我使用单个列时,它工作得很好

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

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

julia> df = DataFrame(2*rand(4,3), [:x1, :x2, :x3])
4×3 DataFrame
│ Row │ x1        │ x2       │ x3       │
│     │ Float64   │ Float64  │ Float64  │
├─────┼───────────┼──────────┼──────────┤
│ 1   │ 0.945879  │ 1.59742  │ 0.882428 │
│ 2   │ 0.0963367 │ 0.400404 │ 0.599865 │
│ 3   │ 1.23356   │ 0.807691 │ 0.547917 │
│ 4   │ 0.756098  │ 0.595673 │ 0.29678  │

julia> @. ifelse(df > 1, df, 0.0)
4×3 DataFrame
│ Row │ x1      │ x2      │ x3      │
│     │ Float64 │ Float64 │ Float64 │
├─────┼─────────┼─────────┼─────────┤
│ 1   │ 0.0     │ 1.59742 │ 0.0     │
│ 2   │ 0.0     │ 0.0     │ 0.0     │
│ 3   │ 1.23356 │ 0.0     │ 0.0     │
│ 4   │ 0.0     │ 0.0     │ 0.0     │
如果您愿意,还可以对其进行
转换

julia> transform(df, names(df) .=> ByRow(x -> ifelse(x>1, x, 0.0)) .=> names(df))
4×3 DataFrame
│ Row │ x1      │ x2      │ x3      │
│     │ Float64 │ Float64 │ Float64 │
├─────┼─────────┼─────────┼─────────┤
│ 1   │ 0.0     │ 1.59742 │ 0.0     │
│ 2   │ 0.0     │ 0.0     │ 0.0     │
│ 3   │ 1.23356 │ 0.0     │ 0.0     │
│ 4   │ 0.0     │ 0.0     │ 0.0     │
在这种情况下,查看链接熊猫解决方案DataFrames.jl似乎更快:

julia> df = DataFrame(2*rand(2,3), [:x1, :x2, :x3])
2×3 DataFrame
 Row │ x1       x2       x3       
     │ Float64  Float64  Float64  
─────┼────────────────────────────
   1 │ 1.48781  1.20332  1.08071
   2 │ 1.55462  1.66393  0.363993

julia> using BenchmarkTools

julia> @btime @. ifelse($df > 1, $df, 0.0)
  6.252 μs (58 allocations: 3.89 KiB)
2×3 DataFrame
 Row │ x1       x2       x3      
     │ Float64  Float64  Float64 
─────┼───────────────────────────
   1 │ 1.48781  1.20332  1.08071
   2 │ 1.55462  1.66393  0.0

(在pandas for 2x3数据帧中,它的范围是163µs到2.26 ms)

你不能做一些简单的事情吗:df=df.mask(df你也可以查看。这回答了你的问题吗?@JoeFerndz我相信这些是与python相关的问题,我在Julia中工作:)我的错,我没有看到Julia。乐于学习新事物。