Dav*_*ira 9 dataframe julia one-hot-encoding
我正在使用 Julia 的 DataFrames.jl 包。在其中,我有一个数据框,其中包含一个包含字符串列表的列(例如 ["Type A"、"Type B"、"Type D"])。那么如何执行one-hot编码?我无法在 DataFrames.jl 包中找到预构建的函数。
这是我想要做的一个例子:
Original Dataframe
col1 | col2 |
102 |[a] |
103 |[a,b] |
102 |[c,b] |
Run Code Online (Sandbox Code Playgroud)
After One-hot encoding
col1 | a | b | c |
102 | 1 | 0 | 0 |
103 | 1 | 1 | 0 |
102 | 0 | 1 | 1 |
Run Code Online (Sandbox Code Playgroud)
DataFrames.jl 中确实没有单热编码功能 - 我认为这是明智的,因为这是一种特殊的机器学习转换,应该存在于 ML 包中,而不是基本的 DataFrames 包中。
我认为你有两个选择:
使用为您执行此操作的 ML 包,例如MLJ.jl。在 MLJ 中,这OneHotEncoder是一个模型,可以将任何包含Finite特征的表转换为自身的单热编码版本,请参阅此处的文档
使用回归包,使用 StatsModels @formulaAPI自动为分类变量生成虚拟列- 如果您使用 eg 拟合回归GLM.jl并且您的公式是@formula(y ~ x)其中x的分类变量,模型矩阵将通过对比编码自动构建x,即具有二进制虚拟列除了一层x
对于第二个选项,理想情况下您希望您的数据是分类数据(尽管字符串也可以工作),并且为此 DataFrames.jl 包含该categorical!函数。
使用我们提供的基本功能很容易做到这一点:
julia> df = DataFrame(x=rand([1:3;missing], 20))
20×1 DataFrame
? Row ? x ?
? ? Int64? ?
?????????????????
? 1 ? 1 ?
? 2 ? 2 ?
? 3 ? missing ?
? 4 ? 1 ?
? 5 ? 3 ?
? 6 ? missing ?
? 7 ? 3 ?
? 8 ? 3 ?
? 9 ? 3 ?
? 10 ? 3 ?
? 11 ? missing ?
? 12 ? 1 ?
? 13 ? 3 ?
? 14 ? 3 ?
? 15 ? 3 ?
? 16 ? 1 ?
? 17 ? missing ?
? 18 ? 1 ?
? 19 ? 1 ?
? 20 ? missing ?
julia> ux = unique(df.x); transform(df, @. :x => ByRow(isequal(ux)) .=> Symbol(:x_, ux))
20×5 DataFrame
? Row ? x ? x_1 ? x_2 ? x_missing ? x_3 ?
? ? Int64? ? Bool ? Bool ? Bool ? Bool ?
??????????????????????????????????????????????????
? 1 ? 1 ? 1 ? 0 ? 0 ? 0 ?
? 2 ? 2 ? 0 ? 1 ? 0 ? 0 ?
? 3 ? missing ? 0 ? 0 ? 1 ? 0 ?
? 4 ? 1 ? 1 ? 0 ? 0 ? 0 ?
? 5 ? 3 ? 0 ? 0 ? 0 ? 1 ?
? 6 ? missing ? 0 ? 0 ? 1 ? 0 ?
? 7 ? 3 ? 0 ? 0 ? 0 ? 1 ?
? 8 ? 3 ? 0 ? 0 ? 0 ? 1 ?
? 9 ? 3 ? 0 ? 0 ? 0 ? 1 ?
? 10 ? 3 ? 0 ? 0 ? 0 ? 1 ?
? 11 ? missing ? 0 ? 0 ? 1 ? 0 ?
? 12 ? 1 ? 1 ? 0 ? 0 ? 0 ?
? 13 ? 3 ? 0 ? 0 ? 0 ? 1 ?
? 14 ? 3 ? 0 ? 0 ? 0 ? 1 ?
? 15 ? 3 ? 0 ? 0 ? 0 ? 1 ?
? 16 ? 1 ? 1 ? 0 ? 0 ? 0 ?
? 17 ? missing ? 0 ? 0 ? 1 ? 0 ?
? 18 ? 1 ? 1 ? 0 ? 0 ? 0 ?
? 19 ? 1 ? 1 ? 0 ? 0 ? 0 ?
? 20 ? missing ? 0 ? 0 ? 1 ? 0 ?
Run Code Online (Sandbox Code Playgroud)
编辑:
另一个例子:
julia> df = DataFrame(col1=102:104, col2=[["a"], ["a","b"], ["c","b"]])
3×2 DataFrame
? Row ? col1 ? col2 ?
? ? Int64 ? Array… ?
????????????????????????????
? 1 ? 102 ? ["a"] ?
? 2 ? 103 ? ["a", "b"] ?
? 3 ? 104 ? ["c", "b"] ?
julia> ux = unique(reduce(vcat, df.col2))
3-element Array{String,1}:
"a"
"b"
"c"
julia> transform(df, :col2 .=> [ByRow(v -> x in v) for x in ux] .=> Symbol.(:col2_, ux))
3×5 DataFrame
? Row ? col1 ? col2 ? col2_a ? col2_b ? col2_c ?
? ? Int64 ? Array… ? Bool ? Bool ? Bool ?
???????????????????????????????????????????????????????
? 1 ? 102 ? ["a"] ? 1 ? 0 ? 0 ?
? 2 ? 103 ? ["a", "b"] ? 1 ? 1 ? 0 ?
? 3 ? 104 ? ["c", "b"] ? 0 ? 1 ? 1 ?
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1045 次 |
| 最近记录: |