首页 > 解决方案 > 如何在 DataFrames.jl(0.19 版)中拆分列值?

问题描述

我正在关注 Tom Kwong 先生的https://github.com/tk3369/data-wrangling-techniques-in-julia教程。

数据帧如下:

julia> df3=stack(df2, Not(:County), variable_name=:Year_Gender, value_name=:Suicides)
486×3 DataFrame
│ Row │ Year_Gender       │ Suicides │ County       │
│     │ Symbol            │ Int64    │ String       │
├─────┼───────────────────┼──────────┼──────────────┤
│ 1   │ Female (2012)     │ 0        │ Asotin       │
│ 2   │ Female (2012)     │ 0        │ Benton       │
│ 3   │ Female (2012)     │ 0        │ Chelan       │
│ 4   │ Female (2012)     │ 0        │ Clallam      │
│ 5   │ Female (2012)     │ 1        │ Clark        │
│ 6   │ Female (2012)     │ 0        │ Columbia     │
│ 7   │ Female (2012)     │ 0        │ Cowlitz      │
│ 8   │ Female (2012)     │ 0        │ Douglas      │
│ 9   │ Female (2012)     │ 0        │ Grays Harbor │
│ 10  │ Female (2012)     │ 0        │ Island       │
│ 11  │ Female (2012)     │ 0        │ Jefferson    │
│ 12  │ Female (2012)     │ 3        │ King         │
│ 13  │ Female (2012)     │ 0        │ Kitsap       │
│ 14  │ Female (2012)     │ 0        │ Lewis        │
│ 15  │ Female (2012)     │ 0        │ Mason        │
│ 16  │ Female (2012)     │ 0        │ Okanogan     │
│ 17  │ Female (2012)     │ 0        │ Pacific      │
│ 18  │ Female (2012)     │ 1        │ Pierce       │
│ 19  │ Female (2012)     │ 0        │ Skagit       │
│ 20  │ Female (2012)     │ 0        │ Snohomish    │
│ 21  │ Female (2012)     │ 0        │ Spokane      │
⋮
│ 465 │ Total (2008-2012) │ 1        │ Columbia     │
│ 466 │ Total (2008-2012) │ 1        │ Cowlitz      │
│ 467 │ Total (2008-2012) │ 2        │ Douglas      │
│ 468 │ Total (2008-2012) │ 6        │ Grays Harbor │
│ 469 │ Total (2008-2012) │ 2        │ Island       │
│ 470 │ Total (2008-2012) │ 1        │ Jefferson    │
│ 471 │ Total (2008-2012) │ 33       │ King         │
│ 472 │ Total (2008-2012) │ 1        │ Kitsap       │
│ 473 │ Total (2008-2012) │ 1        │ Lewis        │
│ 474 │ Total (2008-2012) │ 1        │ Mason        │
│ 475 │ Total (2008-2012) │ 2        │ Okanogan     │
│ 476 │ Total (2008-2012) │ 3        │ Pacific      │
│ 477 │ Total (2008-2012) │ 20       │ Pierce       │
│ 478 │ Total (2008-2012) │ 3        │ Skagit       │
│ 479 │ Total (2008-2012) │ 11       │ Snohomish    │
│ 480 │ Total (2008-2012) │ 6        │ Spokane      │
│ 481 │ Total (2008-2012) │ 2        │ Stevens      │
│ 482 │ Total (2008-2012) │ 2        │ Thurston     │
│ 483 │ Total (2008-2012) │ 1        │ Walla Walla  │
│ 484 │ Total (2008-2012) │ 5        │ Whatcom      │
│ 485 │ Total (2008-2012) │ 1        │ Whitman      │
│ 486 │ Total (2008-2012) │ 8        │ Yakima       │

我正在尝试按如下方式拆分 Year_Gender 列值:

julia> df3.Year=[split(x, " ")[1] for x in df3.Year_Gender]
ERROR: MethodError: no method matching split(::Symbol, ::String)
Closest candidates are:
  split(::T, ::Any; limit, keepempty) where T<:AbstractString at strings/util.jl:313
Stacktrace:
 [1] (::var"#3#4")(::Symbol) at ./none:0
 [2] iterate at ./generator.jl:47 [inlined]
 [3] collect(::Base.Generator{Array{Symbol,1},var"#3#4"}) at ./array.jl:665
 [4] top-level scope at REPL[9]:1

julia> 

请指导我在 DataFrames 0.19 版中拆分列值,因为我无法更新。

标签: dataframejulia

解决方案


让我首先说我不建议使用 DataFrames 0.19 - 当前版本是 1.2,所以 0.19 在这一点上相当古老。由于 DataFrames 已经过了它的第一个主要版本 1.0,API 现在被认为是稳定的,所以最好学习当前的做事方式,因为这可能会在可预见的未来为您提供良好的服务。

话虽如此,您的问题与 DataFrames 无关,而这正是 Julia 的基本工作方式:

julia> split(Symbol("Female (2012)"), " ")
ERROR: MethodError: no method matching split(::Symbol, ::String)
Closest candidates are:
  split(::T, ::Any; limit, keepempty) where T<:AbstractString at strings/util.jl:401
Stacktrace:
 [1] top-level scope
   @ REPL[5]:1

如果要使用split,则需要在列中使用 aString而不是 aSymbol来拆分它:

julia> split(string(Symbol("Female (2012)")), " ")
2-element Vector{SubString{String}}:
 "Female"
 "(2012)"

您可以使用 访问此的第二个元素last,并且您可能还需要考虑删除括号,然后调用parse(Int, x)它以获取一个数字。


推荐阅读