Документация Engee

Сортировка

Сортировка является фундаментальным компонентом анализа данных. Базовая сортировка выполняется довольно просто: вызовите функцию sort!, чтобы отсортировать все столбцы на месте:

julia> using DataFrames, CSV

julia> path = joinpath(pkgdir(DataFrames), "docs", "src", "assets", "iris.csv");

julia> iris = CSV.read(path, DataFrame)
150×5 DataFrame
 Row │ SepalLength  SepalWidth  PetalLength  PetalWidth  Species
     │ Float64      Float64     Float64      Float64     String15
─────┼──────────────────────────────────────────────────────────────────
   1 │         5.1         3.5          1.4         0.2  Iris-setosa
   2 │         4.9         3.0          1.4         0.2  Iris-setosa
   3 │         4.7         3.2          1.3         0.2  Iris-setosa
   4 │         4.6         3.1          1.5         0.2  Iris-setosa
   5 │         5.0         3.6          1.4         0.2  Iris-setosa
   6 │         5.4         3.9          1.7         0.4  Iris-setosa
   7 │         4.6         3.4          1.4         0.3  Iris-setosa
   8 │         5.0         3.4          1.5         0.2  Iris-setosa
  ⋮  │      ⋮           ⋮            ⋮           ⋮             ⋮
 144 │         6.8         3.2          5.9         2.3  Iris-virginica
 145 │         6.7         3.3          5.7         2.5  Iris-virginica
 146 │         6.7         3.0          5.2         2.3  Iris-virginica
 147 │         6.3         2.5          5.0         1.9  Iris-virginica
 148 │         6.5         3.0          5.2         2.0  Iris-virginica
 149 │         6.2         3.4          5.4         2.3  Iris-virginica
 150 │         5.9         3.0          5.1         1.8  Iris-virginica
                                                        135 rows omitted

julia> sort!(iris)
150×5 DataFrame
 Row │ SepalLength  SepalWidth  PetalLength  PetalWidth  Species
     │ Float64      Float64     Float64      Float64     String15
─────┼──────────────────────────────────────────────────────────────────
   1 │         4.3         3.0          1.1         0.1  Iris-setosa
   2 │         4.4         2.9          1.4         0.2  Iris-setosa
   3 │         4.4         3.0          1.3         0.2  Iris-setosa
   4 │         4.4         3.2          1.3         0.2  Iris-setosa
   5 │         4.5         2.3          1.3         0.3  Iris-setosa
   6 │         4.6         3.1          1.5         0.2  Iris-setosa
   7 │         4.6         3.2          1.4         0.2  Iris-setosa
   8 │         4.6         3.4          1.4         0.3  Iris-setosa
  ⋮  │      ⋮           ⋮            ⋮           ⋮             ⋮
 144 │         7.4         2.8          6.1         1.9  Iris-virginica
 145 │         7.6         3.0          6.6         2.1  Iris-virginica
 146 │         7.7         2.6          6.9         2.3  Iris-virginica
 147 │         7.7         2.8          6.7         2.0  Iris-virginica
 148 │         7.7         3.0          6.1         2.3  Iris-virginica
 149 │         7.7         3.8          6.7         2.2  Iris-virginica
 150 │         7.9         3.8          6.4         2.0  Iris-virginica
                                                        135 rows omitted

Обратите внимание, что при сортировке DataFrame все столбцы учитываются лексикографически.

Вы также можете вызвать функцию sort, чтобы создать новый DataFrame с только что выделенными отсортированными векторами.

При сортировке DataFrame можно отсортировать разные столбцы с использованием разных параметров. Вот несколько примеров, демонстрирующих большинство возможных вариантов.

julia> sort!(iris, rev = true)
150×5 DataFrame
 Row │ SepalLength  SepalWidth  PetalLength  PetalWidth  Species
     │ Float64      Float64     Float64      Float64     String15
─────┼──────────────────────────────────────────────────────────────────
   1 │         7.9         3.8          6.4         2.0  Iris-virginica
   2 │         7.7         3.8          6.7         2.2  Iris-virginica
   3 │         7.7         3.0          6.1         2.3  Iris-virginica
   4 │         7.7         2.8          6.7         2.0  Iris-virginica
   5 │         7.7         2.6          6.9         2.3  Iris-virginica
   6 │         7.6         3.0          6.6         2.1  Iris-virginica
   7 │         7.4         2.8          6.1         1.9  Iris-virginica
   8 │         7.3         2.9          6.3         1.8  Iris-virginica
  ⋮  │      ⋮           ⋮            ⋮           ⋮             ⋮
 144 │         4.6         3.2          1.4         0.2  Iris-setosa
 145 │         4.6         3.1          1.5         0.2  Iris-setosa
 146 │         4.5         2.3          1.3         0.3  Iris-setosa
 147 │         4.4         3.2          1.3         0.2  Iris-setosa
 148 │         4.4         3.0          1.3         0.2  Iris-setosa
 149 │         4.4         2.9          1.4         0.2  Iris-setosa
 150 │         4.3         3.0          1.1         0.1  Iris-setosa
                                                        135 rows omitted

julia> sort!(iris, [:Species, :SepalWidth])
150×5 DataFrame
 Row │ SepalLength  SepalWidth  PetalLength  PetalWidth  Species
     │ Float64      Float64     Float64      Float64     String15
─────┼──────────────────────────────────────────────────────────────────
   1 │         4.5         2.3          1.3         0.3  Iris-setosa
   2 │         4.4         2.9          1.4         0.2  Iris-setosa
   3 │         5.0         3.0          1.6         0.2  Iris-setosa
   4 │         4.9         3.0          1.4         0.2  Iris-setosa
   5 │         4.8         3.0          1.4         0.3  Iris-setosa
   6 │         4.8         3.0          1.4         0.1  Iris-setosa
   7 │         4.4         3.0          1.3         0.2  Iris-setosa
   8 │         4.3         3.0          1.1         0.1  Iris-setosa
  ⋮  │      ⋮           ⋮            ⋮           ⋮             ⋮
 144 │         6.7         3.3          5.7         2.1  Iris-virginica
 145 │         6.3         3.3          6.0         2.5  Iris-virginica
 146 │         6.3         3.4          5.6         2.4  Iris-virginica
 147 │         6.2         3.4          5.4         2.3  Iris-virginica
 148 │         7.2         3.6          6.1         2.5  Iris-virginica
 149 │         7.9         3.8          6.4         2.0  Iris-virginica
 150 │         7.7         3.8          6.7         2.2  Iris-virginica
                                                        135 rows omitted

julia> sort!(iris, [order(:Species, by=length), order(:SepalLength, rev=true)])
150×5 DataFrame
 Row │ SepalLength  SepalWidth  PetalLength  PetalWidth  Species
     │ Float64      Float64     Float64      Float64     String15
─────┼───────────────────────────────────────────────────────────────────
   1 │         5.8         4.0          1.2         0.2  Iris-setosa
   2 │         5.7         3.8          1.7         0.3  Iris-setosa
   3 │         5.7         4.4          1.5         0.4  Iris-setosa
   4 │         5.5         3.5          1.3         0.2  Iris-setosa
   5 │         5.5         4.2          1.4         0.2  Iris-setosa
   6 │         5.4         3.4          1.7         0.2  Iris-setosa
   7 │         5.4         3.4          1.5         0.4  Iris-setosa
   8 │         5.4         3.7          1.5         0.2  Iris-setosa
  ⋮  │      ⋮           ⋮            ⋮           ⋮              ⋮
 144 │         5.5         2.6          4.4         1.2  Iris-versicolor
 145 │         5.4         3.0          4.5         1.5  Iris-versicolor
 146 │         5.2         2.7          3.9         1.4  Iris-versicolor
 147 │         5.1         2.5          3.0         1.1  Iris-versicolor
 148 │         5.0         2.0          3.5         1.0  Iris-versicolor
 149 │         5.0         2.3          3.3         1.0  Iris-versicolor
 150 │         4.9         2.4          3.3         1.0  Iris-versicolor
                                                         135 rows omitted

В число ключевых слов, использовавшихся выше, входят rev (для сортировки в обратном направлении) и by (для применения функции к значениям перед их сравнением). Каждое ключевое слово может быть либо отдельным значением, либо вектором со значениями, соответствующими отдельным столбцам, либо селектором: :, Cols, All, Not, Between или Regex.

Вместо значений вектора можно использовать order, чтобы указать порядок для определенного столбца в наборе столбцов.

В следующих двух примерах показаны два способа сортировки набора данных iris с выводом одинакового результата. Значения :Species будут упорядочены в обратном порядке, а внутри групп строки будут отсортированы по возрастанию значений :PetalLength:

julia> sort!(iris, [:Species, :PetalLength], rev=[true, false])
150×5 DataFrame
 Row │ SepalLength  SepalWidth  PetalLength  PetalWidth  Species
     │ Float64      Float64     Float64      Float64     String15
─────┼──────────────────────────────────────────────────────────────────
   1 │         4.9         2.5          4.5         1.7  Iris-virginica
   2 │         6.2         2.8          4.8         1.8  Iris-virginica
   3 │         6.0         3.0          4.8         1.8  Iris-virginica
   4 │         6.3         2.7          4.9         1.8  Iris-virginica
   5 │         6.1         3.0          4.9         1.8  Iris-virginica
   6 │         5.6         2.8          4.9         2.0  Iris-virginica
   7 │         6.3         2.5          5.0         1.9  Iris-virginica
   8 │         6.0         2.2          5.0         1.5  Iris-virginica
  ⋮  │      ⋮           ⋮            ⋮           ⋮             ⋮
 144 │         4.7         3.2          1.6         0.2  Iris-setosa
 145 │         5.7         3.8          1.7         0.3  Iris-setosa
 146 │         5.4         3.4          1.7         0.2  Iris-setosa
 147 │         5.4         3.9          1.7         0.4  Iris-setosa
 148 │         5.1         3.3          1.7         0.5  Iris-setosa
 149 │         5.1         3.8          1.9         0.4  Iris-setosa
 150 │         4.8         3.4          1.9         0.2  Iris-setosa
                                                        135 rows omitted

julia> sort!(iris, [order(:Species, rev=true), :PetalLength])
150×5 DataFrame
 Row │ SepalLength  SepalWidth  PetalLength  PetalWidth  Species
     │ Float64      Float64     Float64      Float64     String15
─────┼──────────────────────────────────────────────────────────────────
   1 │         4.9         2.5          4.5         1.7  Iris-virginica
   2 │         6.2         2.8          4.8         1.8  Iris-virginica
   3 │         6.0         3.0          4.8         1.8  Iris-virginica
   4 │         6.3         2.7          4.9         1.8  Iris-virginica
   5 │         6.1         3.0          4.9         1.8  Iris-virginica
   6 │         5.6         2.8          4.9         2.0  Iris-virginica
   7 │         6.3         2.5          5.0         1.9  Iris-virginica
   8 │         6.0         2.2          5.0         1.5  Iris-virginica
  ⋮  │      ⋮           ⋮            ⋮           ⋮             ⋮
 144 │         4.7         3.2          1.6         0.2  Iris-setosa
 145 │         5.7         3.8          1.7         0.3  Iris-setosa
 146 │         5.4         3.4          1.7         0.2  Iris-setosa
 147 │         5.4         3.9          1.7         0.4  Iris-setosa
 148 │         5.1         3.3          1.7         0.5  Iris-setosa
 149 │         5.1         3.8          1.9         0.4  Iris-setosa
 150 │         4.8         3.4          1.9         0.2  Iris-setosa
                                                        135 rows omitted