Julia DataFrames.jl,Groupby和求和多列

恐惧

我想知道如何使用“ 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]])))
BogumiłKamiński

不要使用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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章