在具有跨行字符串列表的列上的 Pandas 中进行标签编码
LabelEncoding in Pandas on a column with list of strings across rows
我想对 pandas 中的一列进行 LabelEncode,其中每一行都包含一个字符串列表。由于类似的 string/text 跨行具有相同的含义,因此编码应该尊重这一点,并且理想情况下用唯一的数字对其进行编码。想象一下:
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)
它returns:
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' 未编码为第三行或第四行中的 'OK'。理想情况下,我想让它们跨行全局编码。也许一种方法是从该列创建一个语料库,并使用标记化或标签编码获取映射以手动编码列表?如何将包含字符串列表的 pandas 列转换为语料库文本?或者有什么更好的方法吗?
预期结果(假设):
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]
一种方法是 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]
我想对 pandas 中的一列进行 LabelEncode,其中每一行都包含一个字符串列表。由于类似的 string/text 跨行具有相同的含义,因此编码应该尊重这一点,并且理想情况下用唯一的数字对其进行编码。想象一下:
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)
它returns:
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' 未编码为第三行或第四行中的 'OK'。理想情况下,我想让它们跨行全局编码。也许一种方法是从该列创建一个语料库,并使用标记化或标签编码获取映射以手动编码列表?如何将包含字符串列表的 pandas 列转换为语料库文本?或者有什么更好的方法吗?
预期结果(假设):
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]
一种方法是 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]