将 DataFrame 拆分为 DataFrame 的 Vector

Split a DataFrame into a Vector of DataFrames

我有一个DataFrame

df = DataFrame(a=[1,1,2,2],b=[6,7,8,9])

4×2 DataFrame
 Row │ a      b     
     │ Int64  Int64 
─────┼──────────────
   1 │     1      6
   2 │     1      7
   3 │     2      8
   4 │     2      9

是否有规范的方法将其拆分为 Vector{DataFrame}s?我可以

[df[df.a .== i,:] for i in unique(df.a)]

2-element Vector{DataFrame}:
 2×2 DataFrame
 Row │ a      b     
     │ Int64  Int64 
─────┼──────────────
   1 │     1      6
   2 │     1      7

 2×2 DataFrame
 Row │ a      b     
     │ Int64  Int64 
─────┼──────────────
   1 │     1      6
   2 │     1      7

但是有没有更优雅的东西?

使用:

julia> gdf = groupby(df, :a, sort=true)
GroupedDataFrame with 2 groups based on key: a
First Group (2 rows): a = 1
 Row │ a      b
     │ Int64  Int64
─────┼──────────────
   1 │     1      6
   2 │     1      7
⋮
Last Group (2 rows): a = 2
 Row │ a      b
     │ Int64  Int64
─────┼──────────────
   1 │     2      8
   2 │     2      9

(您可以省略 sort=true,但排序确保输出按查找键的升序排列)。

那么你可以将这个对象作为一个向量来处理:

julia> gdf[1]
2×2 SubDataFrame
 Row │ a      b
     │ Int64  Int64
─────┼──────────────
   1 │     1      6
   2 │     1      7

julia> gdf[2]
2×2 SubDataFrame
 Row │ a      b
     │ Int64  Int64
─────┼──────────────
   1 │     2      8
   2 │     2      9

此操作是 non-allocating(它是原始数据框的视图)。

如果你真的想要Vector{DataFrame}(即制作所有组的副本)做:

julia> collect(DataFrame, gdf)
2-element Vector{DataFrame}:
 2×2 DataFrame
 Row │ a      b
     │ Int64  Int64
─────┼──────────────
   1 │     1      6
   2 │     1      7
 2×2 DataFrame
 Row │ a      b
     │ Int64  Int64
─────┼──────────────
   1 │     2      8
   2 │     2      9