如何在 Julia 中将 GroupedDataFrame 转换为 DataFrame?

How to convert a GroupedDataFrame to a DataFrame in Julia?

我已经使用 groupby 函数对 DataFrame 的子集进行了计算:

using RDatasets
iris = dataset("datasets", "iris")
describe(iris)
iris_grouped = groupby(iris,:Species)
iris_avg = map(:SepalLength => mean,iris_grouped::GroupedDataFrame)

现在我想绘制结果,但我收到以下绘图的错误消息:

@df iris_avg bar(:Species,:SepalLength)

Only tables are supported

绘制数据的最佳方法是什么?我的想法是创建一个单一的 DataFrame 并从那里开始。我该怎么做,即如何将 GroupedDataFrame 转换为单个 DataFrame?谢谢!

要将 GroupedDataFrame 转换为 DataFrame 只需对其调用 DataFrame,例如:

julia> DataFrame(iris_avg)
3×2 DataFrame
│ Row │ Species      │ SepalLength_mean │
│     │ Categorical… │ Float64          │
├─────┼──────────────┼──────────────────┤
│ 1   │ setosa       │ 5.006            │
│ 2   │ versicolor   │ 5.936            │
│ 3   │ virginica    │ 6.588            │

你的情况。

你也可以这样写:

julia> combine(:SepalLength => mean, iris_grouped)
3×2 DataFrame
│ Row │ Species      │ SepalLength_mean │
│     │ Categorical… │ Float64          │
├─────┼──────────────┼──────────────────┤
│ 1   │ setosa       │ 5.006            │
│ 2   │ versicolor   │ 5.936            │
│ 3   │ virginica    │ 6.588            │

原始 GroupedDataFrame

julia> by(:SepalLength => mean, iris, :Species)
3×2 DataFrame
│ Row │ Species      │ SepalLength_mean │
│     │ Categorical… │ Float64          │
├─────┼──────────────┼──────────────────┤
│ 1   │ setosa       │ 5.006            │
│ 2   │ versicolor   │ 5.936            │
│ 3   │ virginica    │ 6.588            │

原件DataFrame

我在这里将转换写为第一个参数,但通常,您会将其写为最后一个(这样您就可以传递多个转换),例如:

julia> by(iris, :Species, :SepalLength => mean, :SepalWidth => minimum)
3×3 DataFrame
│ Row │ Species      │ SepalLength_mean │ SepalWidth_minimum │
│     │ Categorical… │ Float64          │ Float64            │
├─────┼──────────────┼──────────────────┼────────────────────┤
│ 1   │ setosa       │ 5.006            │ 2.3                │
│ 2   │ versicolor   │ 5.936            │ 2.0                │
│ 3   │ virginica    │ 6.588            │ 2.2                │

我认为您最好使用 by 函数直接访问您的 iris_avgby 遍历 DataFrame,然后将给定函数应用于结果。通常,它与 do 块一起使用。

julia> by(iris, :Species) do df
           DataFrame(sepal_mean = mean(df.SepalLength))
       end
3×2 DataFrame
│ Row │ Species      │ sepal_mean │
│     │ Categorical… │ Float64    │
├─────┼──────────────┼────────────┤
│ 1   │ setosa       │ 5.006      │
│ 2   │ versicolor   │ 5.936      │
│ 3   │ virginica    │ 6.588      │

或者等价地,

julia> by(iris, :Species, SepalLength_mean = :SepalLength => mean)
3×2 DataFrame
│ Row │ Species      │ SepalLength_mean │
│     │ Categorical… │ Float64          │
├─────┼──────────────┼──────────────────┤
│ 1   │ setosa       │ 5.006            │
│ 2   │ versicolor   │ 5.936            │
│ 3   │ virginica    │ 6.588            │

See here 更多 details/examples.

或者,您可以像之前那样分几步完成,然后使用 DataFrame 构造函数转换为正确的 DataFrame:

julia> iris_grouped = groupby(iris,:Species);

julia> iris_avg = map(:SepalLength => mean,iris_grouped::GroupedDataFrame);

julia> DataFrame(iris_avg)
3×2 DataFrame
│ Row │ Species      │ SepalLength_mean │
│     │ Categorical… │ Float64          │
├─────┼──────────────┼──────────────────┤
│ 1   │ setosa       │ 5.006            │
│ 2   │ versicolor   │ 5.936            │
│ 3   │ virginica    │ 6.588            │