我想知道如何使用“ 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])))
但是,我想获得人口和GDP的总和。我尝试了以下类似的方法,这当然是不正确的。有任何想法吗?
by(someData, :Countries, df ->DataFrame(pop_sum, GDP_sum = sum(df[[:population,:GDP]])))
不要使用by
函数,因为它已被弃用。而是使用它(您不会看到警告,因为您可能是在将Julia--depwarn
设置为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 │
编写它的另一种方法是:
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 │
但是在这种情况下,它比较冗长(如果您想在返回值之前对数据进行更复杂的预处理,这将很有用)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句