在Pandas数据框中编码/因子化列表

3

我尝试通过因子化对数据框中的类别列表进行编码。然后,我将从这系列列表创建一个矩阵(将其归一化为一个固定长度,创建一个多维数组,并对矩阵中的元素进行一位有效编码)。

然而,在行之间这些因子不保持一致性。可以从以下内容看到:

>>> import pandas as pd
>>> df = pd.DataFrame({'A': [ ['Other', 'Male', 'Female', 'Male', 'Other'], ['Female', 'Other', 'Male'] ]})
>>> df['B'] = df.A.apply(lambda x: pd.factorize(x)[0])
>>> df
                                    A                B
0  [Other, Male, Female, Male, Other]  [0, 1, 2, 1, 0]
1               [Female, Other, Male]        [0, 1, 2]

有人知道如何在这个系列中保持编码在行之间一致吗?

get_dummies 对你的使用情况不起作用吗? - Ryan Stout
感谢您提供“get_dummies”的想法,我真的很喜欢它创建独热向量的方式。不幸的是,当每个元素的列表长度不相等时,我还没有找到一种将所有独热向量从系列中删除并重新转换为3D张量类型的方法。 - chase
2个回答

4
你可以使用sklearn中的LabelEncoder
适配编码器:
from sklearn import preprocessing
le = preprocessing.LabelEncoder()
le.fit([s for l in df.A for s in l])

转换列:

df.A.apply(le.transform)
#0    [2, 1, 0, 1, 2]
#1          [0, 2, 1]
#Name: A, dtype: object

le.classes_
#array(['Female', 'Male', 'Other'], 
#      dtype='<U6')

1
谢谢,我真的很喜欢这个方法,因为你可以通过 df['C']=df.B.apply(lambda x: le.classes_[x]) 轻松地回到标签。 - chase

3

您可以轻松地使用列A中的所有值自行完成。

首先,使用集合推导式创建包含列A中所有唯一项的集合。然后使用字典推导式,其中键是这些唯一项,值是基于这些排序唯一项的枚举值。

然后使用列表推导式在此字典中查找项目。

s = set(item for sublist in df.A for item in sublist)
s = {k: n for n, k in enumerate(sorted(list(s)))}

>>> df.assign(B=[[s[key] for key in sublist] for sublist in df['A']])
                                    A                B
0  [Other, Male, Female, Male, Other]  [2, 1, 0, 1, 2]
1               [Female, Other, Male]        [0, 2, 1]

谢谢,这是一个很好的答案,因为您可以对编码进行很多控制。我自己创建了一个编码器类来执行单热编码、哈夫曼编码和索引编码,但我也想看看其他保持一致性且不需要大量代码来定义编码的方法。 - chase

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接