Julia DataFrames - 如何进行单热编码?

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)

Nil*_*dat 7

DataFrames.jl 中确实没有单热编码功能 - 我认为这是明智的,因为这是一种特殊的机器学习转换,应该存在于 ML 包中,而不是基本的 DataFrames 包中。

我认为你有两个选择:

  1. 使用为您执行此操作的 ML 包,例如MLJ.jl。在 MLJ 中,这OneHotEncoder是一个模型,可以将任何包含Finite特征的表转换为自身的单热编码版本,请参阅此处的文档

  2. 使用回归包,使用 StatsModels @formulaAPI自动为分类变量生成虚拟列- 如果您使用 eg 拟合回归GLM.jl并且您的公式是@formula(y ~ x)其中x的分类变量,模型矩阵将通过对比编码自动构建x,即具有二进制虚拟列除了一层x

对于第二个选项,理想情况下您希望您的数据是分类数据(尽管字符串也可以工作),并且为此 DataFrames.jl 包含该categorical!函数。


Bog*_*ski 7

使用我们提供的基本功能很容易做到这一点:

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)