1

我想 LabelEncode 熊猫中的一列,其中每一行都包含一个字符串列表。由于类似的字符串/文本在各行中具有相同的含义,因此编码应该尊重这一点,并最好用唯一的数字对其进行编码。想象:

import pandas as pd

df =pd.DataFrame({
                  'A':[['OK', 'NG', 'Repair', 'Peace'],['Sky', 'NG', 'Fixed', 'Conflict'],['Crossed', 'OK', 'Engine', 'Peace'],['OK', 'Beats', 'RPi', 'Country']]
                  })

# df
                              A
0       [OK, NG, Repair, Peace]
1    [Sky, NG, Fixed, Conflict]
2  [Crossed, OK, Engine, Peace]
3     [OK, Beats, RPi, Country]

当我执行以下操作时:

le = LabelEncoder()
df['LabelEncodedA'] = df['A'].apply(le.fit_transform)

它返回:

                              A LabelEncodedA
0       [OK, NG, Repair, Peace]  [1, 0, 3, 2]
1    [Sky, NG, Fixed, Conflict]  [1, 3, 2, 0]
2  [Crossed, OK, Engine, Peace]  [0, 2, 1, 3]
3     [OK, Beats, RPi, Country]  [2, 0, 3, 1]

这不是预期的结果。这里每一行都是独立的 LabelEncoded。并且第一行中的字符串(例如“OK”)未编码为第三行或第四行中的字符串。理想情况下,我想让它们跨行全局编码。也许一种方法是从该列中创建一个语料库,并使用 Tokenization 或 LabelEncoding 获得一个映射来手动编码列表?如何将包含字符串列表的熊猫列中的然后转换为语料库文本?或者有没有更好的方法?

预期结果(假设):

                              A LabelEncodedA
0       [OK, NG, Repair, Peace]  [0, 1, 2, 3]
1    [Sky, NG, Fixed, Conflict]  [4, 1, 5, 6]
2  [Crossed, OK, Engine, Peace]  [7, 0, 8, 9]
3     [OK, Beats, RPi, Country]  [0, 10, 11, 12]
4

1 回答 1

1

一种方法是对explode列进行编码,然后factorize将列编码为分类变量,然后对编码的列进行分组并使用聚合list

a = df['A'].explode()
a[:] = a.factorize()[0]
df['Encoded'] = a.groupby(level=0).agg(list)

结果

                              A         Encoded
0       [OK, NG, Repair, Peace]    [0, 1, 2, 3]
1    [Sky, NG, Fixed, Conflict]    [4, 1, 5, 6]
2  [Crossed, OK, Engine, Peace]    [7, 0, 8, 3]
3     [OK, Beats, RPi, Country]  [0, 9, 10, 11]
于 2022-02-24T15:29:38.870 回答