我想知道如何使用“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)
不要使用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)
但在这种情况下它更冗长(如果您想在返回值之前对数据进行更复杂的预处理,这将很有用)。
| 归档时间: |
|
| 查看次数: |
499 次 |
| 最近记录: |