Groupby 与 Julia Dataframe 上的 sum

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 中做到这一点吗?

Bog*_*ski 7

尝试(实际上,您可能想要数字列,而不是非字符串列):

\n
numcols = names(df, findall(x -> eltype(x) <: Number, eachcol(df)))\ncombine(groupby(df, ["A", "B"]), numcols .=> sum .=> numcols)\n
Run Code Online (Sandbox Code Playgroud)\n

如果您想允许missing值(并在求和时跳过它们),那么:

\n
numcols = names(df, findall(x -> eltype(x) <: Union{Missing,Number}, eachcol(df)))\ncombine(groupby(df, ["A", "B"]), numcols .=> sum\xe2\x88\x98skipmissing .=> numcols)\n
Run Code Online (Sandbox Code Playgroud)\n


And*_*kin 5

Julia DataFrames 支持split-apply-combine逻辑,类似于 pandas,因此聚合看起来像

\n
using 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)\n
Run Code Online (Sandbox Code Playgroud)\n

结果

\n
julia> 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\n
Run Code Online (Sandbox Code Playgroud)\n

gdf您可以借助Pipe.jlUnderscores.jl跳过创建

\n
using Underscores\n\n@_ groupby(df, [:A, :B]) |> combine(__, :C => sum)\n
Run Code Online (Sandbox Code Playgroud)\n

您可以使用以下语法为新列命名

\n
julia> @_ 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\n
Run Code Online (Sandbox Code Playgroud)\n