【问题标题】:Julia DataFrames.jl, Groupby and summing multiple columnsJulia DataFrames.jl,Groupby 和对多列求和
【发布时间】:2020-11-04 01:06:50
【问题描述】:

我想知道如何使用“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]])))

【问题讨论】:

    标签: dataframe julia


    【解决方案1】:

    不要使用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     │
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-07-23
      • 2021-05-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-20
      相关资源
      最近更新 更多