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。乐于学习新事物。