Groupby avec somme sur Julia Dataframe
J'essaie de faire un groupby + sum sur un Julia Dataframe avec des valeurs Int et String
Par exemple, 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 │
Pour ce faire en Python, la commande peut être:
df_group = df.groupby(['A', 'B']).sum().reset_index()
J'obtiendrai le résultat de sortie suivant avec les étiquettes de colonne initiales:
A B C
0 x1 a 12
1 x1 b 14
2 x2 a 11
J'aimerais faire la même chose avec Julia. J'ai essayé de cette façon, sans succès:
df_group = aggregate(df, ["A", "B"], sum)
MethodError: aucune méthode correspondant à + (:: String, :: String)
Avez-vous une idée d'une façon de faire cela avec Julia?
Réponses
Essayez (en fait, au lieu de colonnes sans chaîne, vous voulez probablement des colonnes numériques):
numcols = names(df, findall(x -> eltype(x) <: Number, eachcol(df)))
combine(groupby(df, ["A", "B"]), numcols .=> sum .=> numcols)
et si vous souhaitez autoriser les missingvaleurs (et les ignorer lors d'une sommation), alors:
numcols = names(df, findall(x -> eltype(x) <: Union{Missing,Number}, eachcol(df)))
combine(groupby(df, ["A", "B"]), numcols .=> sum∘skipmissing .=> numcols)
Julia DataFrames prend en charge la logique split-apply-combine , similaire aux pandas, donc l'agrégation ressemble
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)
Avec le résultat
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 │
Vous pouvez ignorer la création de gdfà l'aide de Pipe.jl ou Underscores.jl
using Underscores
@_ groupby(df, [:A, :B]) |> combine(__, :C => sum)
Vous pouvez donner un nom à la nouvelle colonne avec la syntaxe suivante
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 │