提取字符串,将它们计数并转置为数据框中的列

Exctracting strings , counting and transposing them as columns in a dataframe

有一个包含 2 列的 pandas 数据框:tagmessage

       tag              |     message
["string1","sttring2"]  |    some text
["string","string3"]    |  another text
["string2"]             | another another text

我想为多标签分类构建一个数据集,所以我需要从 tag 中提取所有不同的 strings,因为它们是我的标签。

我需要的:

我需要在标签中转置这个包含大约 40 个不同 strings 的列表,然后插入每个相对于消息列的计数。 所以最终的数据框应该是这样的:

      tag               |     message           string  string1   string2    string3
["string1","string2"]   |    some text             0      1          1          0        
["string","string3"]    |  another text            1      0          0          1
["string2"]             | another another text     0      0          1          0

请注意,new_df 数据框必须有 2 个原始列 + ~40 个新列,因为标签列中大约有 40 个不同的字符串。

我如何在 Julia 中执行此操作

方法有很多种,举两个例子:

julia> df = DataFrame(tag=[["string1","sttring2"], ["string","string3"], ["string2"]],
                      message=["some text", "another text", "another another text"])
3×2 DataFrame
 Row │ tag                      message
     │ Array…                   String
─────┼───────────────────────────────────────────────
   1 │ ["string1", "sttring2"]  some text
   2 │ ["string", "string3"]    another text
   3 │ ["string2"]              another another text

julia> [df DataFrame([col => in.(col, df.tag) for col in foldl(union!, df.tag, init=Set{String}())])]
3×7 DataFrame
 Row │ tag                      message               string  string2  string3  string1  sttring2 
     │ Array…                   String                Bool    Bool     Bool     Bool     Bool     
─────┼────────────────────────────────────────────────────────────────────────────────────────────
   1 │ ["string1", "sttring2"]  some text              false    false    false     true      true
   2 │ ["string", "string3"]    another text            true    false     true    false     false
   3 │ ["string2"]              another another text   false     true    false    false     false

julia> transform(df, [:tag => ByRow(x -> in(col, x)) => col for col in foldl(union!, df.tag, init=Set{String}())])
3×7 DataFrame
 Row │ tag                      message               string  string2  string3  string1  sttring2 
     │ Array…                   String                Bool    Bool     Bool     Bool     Bool
─────┼────────────────────────────────────────────────────────────────────────────────────────────
   1 │ ["string1", "sttring2"]  some text              false    false    false     true      true
   2 │ ["string", "string3"]    another text            true    false     true    false     false
   3 │ ["string2"]              another another text   false     true    false    false     false