Julia数据帧上带有和的Groupby



我正试图在具有Int和String值的Julia数据帧上进行groupby+求和

例如,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 │

要在Python中执行此操作,命令可以是:

df_group = df.groupby(['A', 'B']).sum().reset_index()

我将获得以下带有初始列标签的输出结果:

A  B   C
0  x1  a  12
1  x1  b  14
2  x2  a  11

我想在茱莉亚身上做同样的事情。我尝试过这种方式,但没有成功:

df_group = aggregate(df, ["A", "B"], sum)

MethodError:没有匹配+(::String,::String(的方法

你有什么办法在茱莉亚身上做到这一点吗?

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

numcols = names(df, findall(x -> eltype(x) <: Number, eachcol(df)))
combine(groupby(df, ["A", "B"]), numcols .=> sum .=> numcols)

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

numcols = names(df, findall(x -> eltype(x) <: Union{Missing,Number}, eachcol(df)))
combine(groupby(df, ["A", "B"]), numcols .=> sum∘skipmissing .=> numcols)

Julia DataFrames支持拆分-应用-组合逻辑,类似于panda,因此聚合看起来像

using DataFrames
df = DataFrame(:A => ["x1", "x2", "x1", "x2", "x1"], 
:B => ["a", "a", "b", "a", "b"],
:C => [12, 7, 5, 4, 9],
:D => ["green", "blue", "red", "blue", "yellow"])
gdf = groupby(df, [:A, :B])
combine(gdf, :C => sum)

结果是

julia> combine(gdf, :C => sum)
3×3 DataFrame
│ Row │ A      │ B      │ C_sum │
│     │ String │ String │ Int64 │
├─────┼────────┼────────┼───────┤
│ 1   │ x1     │ a      │ 12    │
│ 2   │ x2     │ a      │ 11    │
│ 3   │ x1     │ b      │ 14    │

您可以在Pipe.jl或Undercores.jl 的帮助下跳过gdf的创建

using Underscores
@_ groupby(df, [:A, :B]) |> combine(__, :C => sum)

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

julia> @_ groupby(df, [:A, :B]) |> combine(__, :C => sum => :C)
3×3 DataFrame
│ Row │ A      │ B      │ C     │
│     │ String │ String │ Int64 │
├─────┼────────┼────────┼───────┤
│ 1   │ x1     │ a      │ 12    │
│ 2   │ x2     │ a      │ 11    │
│ 3   │ x1     │ b      │ 14    │

最新更新