Beb*_*bio 6 group-by aggregate dataframe julia
我正在尝试在具有 Int 和 String 值的 Julia Dataframe 上创建 groupby + sum
例如, df :
? Row ? A ? B ? C ? D ?
? ? String ? String ? Int64 ? String ?
??????????????????????????????????????????
? 1 ? x1 ? a ? 12 ? green ?
? 2 ? x2 ? a ? 7 ? blue ?
? 3 ? x1 ? b ? 5 ? red ?
? 4 ? x2 ? a ? 4 ? blue ?
? 5 ? x1 ? b ? 9 ? yellow ?
Run Code Online (Sandbox Code Playgroud)
要在 Python 中执行此操作,命令可以是:
df_group = df.groupby(['A', 'B']).sum().reset_index()
Run Code Online (Sandbox Code Playgroud)
我将使用初始列标签获得以下输出结果:
A B C
0 x1 a 12
1 x1 b 14
2 x2 a 11
Run Code Online (Sandbox Code Playgroud)
我想在 Julia 中做同样的事情。我试过这种方式,没有成功:
df_group = aggregate(df, ["A", "B"], sum)
Run Code Online (Sandbox Code Playgroud)
MethodError: 没有方法匹配 +(::String, ::String)
你有什么办法在 Julia 中做到这一点吗?
尝试(实际上,您可能想要数字列,而不是非字符串列):
\nnumcols = names(df, findall(x -> eltype(x) <: Number, eachcol(df)))\ncombine(groupby(df, ["A", "B"]), numcols .=> sum .=> numcols)\nRun Code Online (Sandbox Code Playgroud)\n如果您想允许missing值(并在求和时跳过它们),那么:
numcols = names(df, findall(x -> eltype(x) <: Union{Missing,Number}, eachcol(df)))\ncombine(groupby(df, ["A", "B"]), numcols .=> sum\xe2\x88\x98skipmissing .=> numcols)\nRun Code Online (Sandbox Code Playgroud)\n
Julia DataFrames 支持split-apply-combine逻辑,类似于 pandas,因此聚合看起来像
\nusing DataFrames\n\ndf = DataFrame(:A => ["x1", "x2", "x1", "x2", "x1"], \n :B => ["a", "a", "b", "a", "b"],\n :C => [12, 7, 5, 4, 9],\n :D => ["green", "blue", "red", "blue", "yellow"])\n\ngdf = groupby(df, [:A, :B])\ncombine(gdf, :C => sum)\nRun Code Online (Sandbox Code Playgroud)\n结果
\njulia> combine(gdf, :C => sum)\n3\xc3\x973 DataFrame\n\xe2\x94\x82 Row \xe2\x94\x82 A \xe2\x94\x82 B \xe2\x94\x82 C_sum \xe2\x94\x82\n\xe2\x94\x82 \xe2\x94\x82 String \xe2\x94\x82 String \xe2\x94\x82 Int64 \xe2\x94\x82\n\xe2\x94\x9c\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\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\xbc\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xa4\n\xe2\x94\x82 1 \xe2\x94\x82 x1 \xe2\x94\x82 a \xe2\x94\x82 12 \xe2\x94\x82\n\xe2\x94\x82 2 \xe2\x94\x82 x2 \xe2\x94\x82 a \xe2\x94\x82 11 \xe2\x94\x82\n\xe2\x94\x82 3 \xe2\x94\x82 x1 \xe2\x94\x82 b \xe2\x94\x82 14 \xe2\x94\x82\nRun Code Online (Sandbox Code Playgroud)\ngdf您可以借助Pipe.jl或Underscores.jl跳过创建
using Underscores\n\n@_ groupby(df, [:A, :B]) |> combine(__, :C => sum)\nRun Code Online (Sandbox Code Playgroud)\n您可以使用以下语法为新列命名
\njulia> @_ groupby(df, [:A, :B]) |> combine(__, :C => sum => :C)\n3\xc3\x973 DataFrame\n\xe2\x94\x82 Row \xe2\x94\x82 A \xe2\x94\x82 B \xe2\x94\x82 C \xe2\x94\x82\n\xe2\x94\x82 \xe2\x94\x82 String \xe2\x94\x82 String \xe2\x94\x82 Int64 \xe2\x94\x82\n\xe2\x94\x9c\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\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\xbc\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xa4\n\xe2\x94\x82 1 \xe2\x94\x82 x1 \xe2\x94\x82 a \xe2\x94\x82 12 \xe2\x94\x82\n\xe2\x94\x82 2 \xe2\x94\x82 x2 \xe2\x94\x82 a \xe2\x94\x82 11 \xe2\x94\x82\n\xe2\x94\x82 3 \xe2\x94\x82 x1 \xe2\x94\x82 b \xe2\x94\x82 14 \xe2\x94\x82\nRun Code Online (Sandbox Code Playgroud)\n