#dataframe #julia #pipe
Вопрос:
Фрейм данных:
julia> df3
486×4 DataFrame
│ Row │ Suicides │ County │ Year │ Gender │
│ │ Int64 │ String │ SubStrin… │ SubStrin… │
├─────┼──────────┼──────────────┼─────────────┼───────────┤
│ 1 │ 0 │ Asotin │ (2012) │ Female │
│ 2 │ 0 │ Benton │ (2012) │ Female │
│ 3 │ 0 │ Chelan │ (2012) │ Female │
│ 4 │ 0 │ Clallam │ (2012) │ Female │
│ 5 │ 1 │ Clark │ (2012) │ Female │
│ 6 │ 0 │ Columbia │ (2012) │ Female │
│ 7 │ 0 │ Cowlitz │ (2012) │ Female │
│ 8 │ 0 │ Douglas │ (2012) │ Female │
│ 9 │ 0 │ Grays Harbor │ (2012) │ Female │
│ 10 │ 0 │ Island │ (2012) │ Female │
│ 11 │ 0 │ Jefferson │ (2012) │ Female │
│ 12 │ 3 │ King │ (2012) │ Female │
│ 13 │ 0 │ Kitsap │ (2012) │ Female │
│ 14 │ 0 │ Lewis │ (2012) │ Female │
│ 15 │ 0 │ Mason │ (2012) │ Female │
│ 16 │ 0 │ Okanogan │ (2012) │ Female │
│ 17 │ 0 │ Pacific │ (2012) │ Female │
│ 18 │ 1 │ Pierce │ (2012) │ Female │
│ 19 │ 0 │ Skagit │ (2012) │ Female │
│ 20 │ 0 │ Snohomish │ (2012) │ Female │
│ 21 │ 0 │ Spokane │ (2012) │ Female │
⋮
│ 465 │ 1 │ Columbia │ (2008-2012) │ Total │
│ 466 │ 1 │ Cowlitz │ (2008-2012) │ Total │
│ 467 │ 2 │ Douglas │ (2008-2012) │ Total │
│ 468 │ 6 │ Grays Harbor │ (2008-2012) │ Total │
│ 469 │ 2 │ Island │ (2008-2012) │ Total │
│ 470 │ 1 │ Jefferson │ (2008-2012) │ Total │
│ 471 │ 33 │ King │ (2008-2012) │ Total │
│ 472 │ 1 │ Kitsap │ (2008-2012) │ Total │
│ 473 │ 1 │ Lewis │ (2008-2012) │ Total │
│ 474 │ 1 │ Mason │ (2008-2012) │ Total │
│ 475 │ 2 │ Okanogan │ (2008-2012) │ Total │
│ 476 │ 3 │ Pacific │ (2008-2012) │ Total │
│ 477 │ 20 │ Pierce │ (2008-2012) │ Total │
│ 478 │ 3 │ Skagit │ (2008-2012) │ Total │
│ 479 │ 11 │ Snohomish │ (2008-2012) │ Total │
│ 480 │ 6 │ Spokane │ (2008-2012) │ Total │
│ 481 │ 2 │ Stevens │ (2008-2012) │ Total │
│ 482 │ 2 │ Thurston │ (2008-2012) │ Total │
│ 483 │ 1 │ Walla Walla │ (2008-2012) │ Total │
│ 484 │ 5 │ Whatcom │ (2008-2012) │ Total │
│ 485 │ 1 │ Whitman │ (2008-2012) │ Total │
│ 486 │ 8 │ Yakima │ (2008-2012) │ Total │
фильтрация строк с помощью трубы, как показано ниже:
julia> df3 = @pipe df3 |>
filter(string(:Suicides) => !=("Total"), _) |>
filter(string(:Year) => !=("(2008-2012)"), _)
Но, получив ошибку, следующим образом:
ERROR: MethodError: objects of type Pair{String,Base.Fix2{typeof(!=),String}} are not callable
Stacktrace:
[1] (::DataFrames.var"#53#54"{Pair{String,Base.Fix2{typeof(!=),String}}})(::DataFrameRow{DataFrame,DataFrames.Index}) at ./none:0
[2] iterate at ./generator.jl:47 [inlined]
[3] collect at ./array.jl:665 [inlined]
[4] filter(::Pair{String,Base.Fix2{typeof(!=),String}}, ::DataFrame) at /opt/julia/julia-1.4.1/share/julia/stdlib/v1.4/packages/DataFrames/yH0f6/src/abstractdataframe/abstractdataframe.jl:758
[5] top-level scope at REPL[26]:1
Пожалуйста, научите меня фильтровать строки фреймов данных с помощью pipe.jl
Ответ №1:
Прежде всего, я бы рекомендовал взглянуть на примеры в REPL.
help?> filter
filter(function, df::AbstractDataFrame)
...
Examples
≡≡≡≡≡≡≡≡≡≡
...
julia> filter(row -> row[:x] > 1, df)
2×2 DataFrame
│ Row │ x │ y │
│ │ Int64 │ String │
├─────┼───────┼────────┤
│ 1 │ 3 │ b │
│ 2 │ 2 │ a │
Как вы можете видеть, первым аргументом должна быть функция, которая принимает строку в качестве параметра.
Во-вторых, это =>
и ->
есть совершенно разные вещи в Джулии. Первый создает значение ключа Pair
, второй — это просто лямбда.
Также странно , что вы сравниваете количество самоубийств с "Total"
тем, с чем, я думаю, вы хотели сравнить Gender
.
Таким образом, исправленный код может быть таким:
df3 = @pipe df3 |>
filter(row -> row[:Gender] != "Total", _) |>
filter(row -> row[:Year] != "(2008-2012)", _)