我有一个包含两列类别标签数据(NBA球队名称)的数据集。我想做的是使用一种热编码来生成二进制一维向量,作为代表每个团队的数组。这是我的代码:
from sklearn.preprocessing import MultiLabelBinarizer
one_hot_encoder = MultiLabelBinarizer()
table["Teams"] = one_hot_encoder.fit_transform(table["Teams"])
编码器正常工作,并相应地生成数组。换句话说,
one_hot_encoder.fit_transform(table["Teams"])
正确生成以下内容:
Link to encoder result screenshot
但是,当我尝试将数组存储到列中时,如下所示:
table["Teams"] = one_hot_encoder.fit_transform(table["Teams"])
似乎没有正确保存它。
Link to data frame result screenshot
相反,它看起来好像该列只是获取每个数组的第一个值,而不是存储整个数组。我应该如何解决这个问题?
答案 0 :(得分:1)
我认为需要将2d
数组转换为list
s:
table = pd.DataFrame({"Teams":list('aaasdffds')})
from sklearn.preprocessing import MultiLabelBinarizer
one_hot_encoder = MultiLabelBinarizer()
table["Teams"] = one_hot_encoder.fit_transform(table["Teams"]).tolist()
print (table)
Teams
0 [1, 0, 0, 0]
1 [1, 0, 0, 0]
2 [1, 0, 0, 0]
3 [0, 0, 0, 1]
4 [0, 1, 0, 0]
5 [0, 0, 1, 0]
6 [0, 0, 1, 0]
7 [0, 1, 0, 0]
8 [0, 0, 0, 1]
但是不建议将数组或列表存储到一列,因为不可能使用向量化方法/函数,最好创建DataFrame
:
table = pd.DataFrame(one_hot_encoder.fit_transform(table["Teams"]),
columns=one_hot_encoder.classes_)
print (table)
a d f s
0 1 0 0 0
1 1 0 0 0
2 1 0 0 0
3 0 0 0 1
4 0 1 0 0
5 0 0 1 0
6 0 0 1 0
7 0 1 0 0
8 0 0 0 1
答案 1 :(得分:0)
意识到您需要在DataFrame中创建一个列表。您可以将数组存储为列表,熊猫不会对其进行修改。
from sklearn.preprocessing import MultiLabelBinarizer
mlb = MultiLabelBinarizer()
encoded_array = mlb.fit_transform(table['Teams'])
table['Teams'] = [ [encoded_array [i,:]] for i in range(table.shape[0]) ]