Как преобразовать GroupedDataFrame в DataFrame в Юлии? - PullRequest
2 голосов
/ 23 сентября 2019

Я выполнил вычисления для подмножеств DataFrame с помощью функции groupby:

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)

Поддерживаются только таблицы

Как лучше всего построить данные?Моя идея состоит в том, чтобы создать один DataFrame и перейти оттуда.Как мне это сделать, то есть, как мне преобразовать GroupedDataFrame в один DataFrame?Спасибо!

Ответы [ 2 ]

5 голосов
/ 23 сентября 2019

Чтобы преобразовать 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                │
3 голосов
/ 23 сентября 2019

Думаю, вам лучше воспользоваться функцией by, чтобы напрямую перейти к iris_avg.by перебирает 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            │

См. Здесь для получения дополнительной информации / примеров.

В качестве альтернативы, вы можете сделать это в несколько шагов, как вы сделали, а затем использовать конструктор 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            │
...