Julia:如何通过使用“transform”或“@transform”添加两列来在 DataFrames.jl 中创建新列?

xia*_*dai 6 dataframe julia

using DataFrames

df = DataFrame(a=1:3, b=1:3)

Run Code Online (Sandbox Code Playgroud)

如何创建一个新列,c以便c = a+b元素明智?

通过阅读文档无法弄清楚transform

我知道

df[!, :c] = df.a .+ df.b

有效,但我想transform在这样的链中使用

@chain df begin
  @transform(c = :a .+ :b)
  @where(...)
  groupby(...)
end
Run Code Online (Sandbox Code Playgroud)

上述语法不适用于 DataFramesMeta.jl

Bog*_*ski 10

这是使用 DataFrames.jl 的答案。

\n

要创建新的数据框:

\n
julia> transform(df, [:a,:b] => (+) => :c)\n3\xc3\x973 DataFrame\n Row \xe2\x94\x82 a      b      c     \n     \xe2\x94\x82 Int64  Int64  Int64 \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\n   1 \xe2\x94\x82     1      1      2\n   2 \xe2\x94\x82     2      2      4\n   3 \xe2\x94\x82     3      3      6\n
Run Code Online (Sandbox Code Playgroud)\n

对于就地操作:

\n
julia> transform!(df, [:a,:b] => (+) => :c)\n3\xc3\x973 DataFrame\n Row \xe2\x94\x82 a      b      c     \n     \xe2\x94\x82 Int64  Int64  Int64 \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\n   1 \xe2\x94\x82     1      1      2\n   2 \xe2\x94\x82     2      2      4\n   3 \xe2\x94\x82     3      3      6\n
Run Code Online (Sandbox Code Playgroud)\n

或者

\n
julia> insertcols!(df, :c => df.a + df.b)\n3\xc3\x973 DataFrame\n Row \xe2\x94\x82 a      b      c     \n     \xe2\x94\x82 Int64  Int64  Int64 \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\n   1 \xe2\x94\x82     1      1      2\n   2 \xe2\x94\x82     2      2      4\n   3 \xe2\x94\x82     3      3      6\n
Run Code Online (Sandbox Code Playgroud)\n

transform!和之间的区别insertcols!在于,如果数据框中存在列,则会insertcols!出错,而会覆盖它。:ctransform!

\n