Julia 从另一个数据帧中提取单独的分组数据帧
将组提取到单独的Julia 从另一个数据帧中提取单独的分组数据帧,julia,Julia,将组提取到单独的数据帧中的最佳/最惯用方法是什么?这在许多方面都很有用(例如,为每个组训练单独的模型,每个组的数据可视化,保存数据的特定子集等) 此类问题的一个最小示例可能是: using DataFrames df = DataFrame(Dict(:groups => ["A", "B", "A"], :val1 => [1, 2, -4], :val2 => [3, 9, 1])) 理想的输
数据帧中的最佳/最惯用方法是什么?这在许多方面都很有用(例如,为每个组训练单独的模型,每个组的数据可视化,保存数据的特定子集等)
此类问题的一个最小示例可能是:
using DataFrames
df = DataFrame(Dict(:groups => ["A", "B", "A"],
:val1 => [1, 2, -4],
:val2 => [3, 9, 1]))
理想的输出是:
group_dict = Dict("A" => DataFrame(Dict(:val1 => [1, -4], :val2 => [3, 1])),
"B" => DataFrame(Dict(:val1 => [2], :val2 => [9])))
一个干净的解决方案是利用Query.jl
的@groupby
:
using Query
df |> @groupby(_.groups) |> ?? |> Dict
但是,我仍停留在最后一步(即将其转换为字典或其他命名集合)。您可以使用DataFrames.groupby(df,:groups)
返回GroupedDataFrame,它是子数据帧的集合。您可以使用DataFrames.groupby(df,:groups)
返回GroupedDataFrame,它是子数据帧的集合。以下内容:
using DataFrames
df = DataFrame(Dict(:groups => ["A", "B", "A"],
:val1 => [1, 2, -4],
:val2 => [3, 9, 1]))
dict = Dict([letter => df[df[!, :groups] .== letter, 2:3]
for letter in unique(df[!, :groups])])
println(dict)
屈服
Dict(
"B" => 1×2 DataFrame
│ Row │ val1 │ val2 │
│ │ Int64 │ Int64 │
├─────┼───────┼───────┤
│ 1 │ 2 │ 9 │,
"A" => 2×2 DataFrame
│ Row │ val1 │ val2 │
│ │ Int64 │ Int64 │
├─────┼───────┼───────┤
│ 1 │ 1 │ 3 │
│ 2 │ -4 │ 1 │)
这看起来是你需要的。注意:在理解语句中需要unique(),因为与dataframe groupby不同,Dict有一个限制,即它需要:组作为键是唯一的。如下:
using DataFrames
df = DataFrame(Dict(:groups => ["A", "B", "A"],
:val1 => [1, 2, -4],
:val2 => [3, 9, 1]))
dict = Dict([letter => df[df[!, :groups] .== letter, 2:3]
for letter in unique(df[!, :groups])])
println(dict)
屈服
Dict(
"B" => 1×2 DataFrame
│ Row │ val1 │ val2 │
│ │ Int64 │ Int64 │
├─────┼───────┼───────┤
│ 1 │ 2 │ 9 │,
"A" => 2×2 DataFrame
│ Row │ val1 │ val2 │
│ │ Int64 │ Int64 │
├─────┼───────┼───────┤
│ 1 │ 1 │ 3 │
│ 2 │ -4 │ 1 │)
这看起来是你需要的。注意:在理解语句中需要unique(),因为与dataframe groupby不同,Dict有一个限制,即它需要:组作为键是唯一的。这是推荐的方法,使用merged(将很快)可以根据值对其进行索引。这是推荐的方法,而使用merged(将很快)您将能够根据值对其进行索引。