Julia DataFrames.jl、Groupby 和多列求和

ima*_*tha 3 dataframe julia

我想知道如何使用“by”函数对多列进行分组和求和。如果我想对一列进行分组,我可以这样做

someData = DataFrame(:Countries => ["Afganistan","Albainia","Albainia","Andorra","Angola","Angola"],:population => rand(100:1000,6), :GDP => rand(1:100,6))

by(someData, :Countries, df ->DataFrame(pop_sum = sum(df[:population])))
Run Code Online (Sandbox Code Playgroud)

但是,我想得到人口和 GDP 的总和。我尝试了类似下面的内容,这当然是不正确的。有任何想法吗?

by(someData, :Countries, df ->DataFrame(pop_sum, GDP_sum = sum(df[[:population,:GDP]])))
Run Code Online (Sandbox Code Playgroud)

Bog*_*ski 6

不要使用by函数,因为它已被弃用。而是使用它(您没有看到警告,因为您可能正在使用默认--depwarn设置的 set to启动 Julia no):

julia> someData = DataFrame(:Countries => ["Afganistan","Albainia","Albainia","Andorra","Angola","Angola"],
                            :population => rand(100:1000,6),
                            :GDP => rand(1:100,6))
6×3 DataFrame
? Row ? Countries  ? population ? GDP   ?
?     ? String     ? Int64      ? Int64 ?
?????????????????????????????????????????
? 1   ? Afganistan ? 543        ? 29    ?
? 2   ? Albainia   ? 853        ? 71    ?
? 3   ? Albainia   ? 438        ? 81    ?
? 4   ? Andorra    ? 860        ? 88    ?
? 5   ? Angola     ? 940        ? 64    ?
? 6   ? Angola     ? 688        ? 40    ?

julia> combine(groupby(someData, :Countries), [:population, :GDP] .=> sum)
4×3 DataFrame
? Row ? Countries  ? population_sum ? GDP_sum ?
?     ? String     ? Int64          ? Int64   ?
???????????????????????????????????????????????
? 1   ? Afganistan ? 543            ? 29      ?
? 2   ? Albainia   ? 1291           ? 152     ?
? 3   ? Andorra    ? 860            ? 88      ?
? 4   ? Angola     ? 1628           ? 104     ?
Run Code Online (Sandbox Code Playgroud)

另一种写法是:

julia> combine(groupby(someData, :Countries)) do sdf
       return (population_sum = sum(sdf.population), GDP_sum=sum(sdf.GDP))
       end
4×3 DataFrame
? Row ? Countries  ? population_sum ? GDP_sum ?
?     ? String     ? Int64          ? Int64   ?
???????????????????????????????????????????????
? 1   ? Afganistan ? 543            ? 29      ?
? 2   ? Albainia   ? 1291           ? 152     ?
? 3   ? Andorra    ? 860            ? 88      ?
? 4   ? Angola     ? 1628           ? 104     ?
Run Code Online (Sandbox Code Playgroud)

但在这种情况下它更冗长(如果您想在返回值之前对数据进行更复杂的预处理,这将很有用)。