如何解决如何使用 pipe.jl 过滤数据帧行?
数据框:
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,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,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 过滤数据帧行
解决方法
首先,我建议您查看 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 │
如你所见,第一个参数应该是一个函数,它接受一个行作为参数。
第二件事是 =>
和 ->
在 Julia 中是完全不同的东西。第一个创建一个键值 Pair
,第二个只是一个 lambda。
另外,奇怪的是,您将许多自杀事件与 "Total"
进行比较,我认为您打算比较 Gender
。
所以更正后的代码可能是这样的:
df3 = @pipe df3 |>
filter(row -> row[:Gender] != "Total",_) |>
filter(row -> row[:Year] != "(2008-2012)",_)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。