如何从csv文件输入进行单热编码



我用

读取了一个csv文件
import pandas
df = pd.read_csv("inputfile")

有些列是数字,有些是字符串。我们称其中一列为数字列'num',另一列为字符串列'col'。我想做以下事情:

  1. 我想能够一个热编码一个字符串列称为'col',并导致稀疏矩阵与它的所有特征。
  2. 我想单热编码df['num'],但只有当df['num'] < 100

如果输入在一个字典列表中,这很容易做到。

步骤1。在运行DictVectorizer

时自动发生

步骤2。只需要我在字典上迭代,必要时为新的字符串特性'num_cat'添加一个键/值对,然后在整个新的字典列表上运行DictVectorizer。

我被困在下面:

  • 我需要矩阵的结果从一个热编码是稀疏的。pd。如果有大量的类别,Get_dummies会非常非常慢。它是先生成一个密集矩阵,然后再使其稀疏吗?因此,我觉得我不能使用它。
  • 我可以做什么我需要没有首先转换数据帧到字典列表,然后运行DictVectorizer?如果没有,是否有简单的方法进行转换?

假设你以

开头
In [31]: df = pd.DataFrame({'col': ['foo', 'foo', 'bar', 'bar'], 'num': [1, 1, 3, 213]})
In [32]: df
Out[32]: 
   col  num
0  foo    1
1  foo    1
2  bar    3
3  bar  213

首先,让我们来处理col:

如果我们定义

In [33]: d = dict([e[:: -1] for e in enumerate(df.col.unique())])

然后我们可以用它来"数字化"col:

In [34]: df.col = df.col.map(d)
In [35]: df
Out[35]: 
   col  num
0    0    1
1    0    1
2    1    3
3    1  213

现在我们来处理num:

In [36]: import numpy as np

我们把所有超过100的都变成100:

In [37]: df.num = np.minimum(df.num.values, 100)
In [38]: df
Out[38]: 
   col  num
0    0    1
1    0    1
2    1    3
3    1  100

现在进行编码:

In [49]: from sklearn import preprocessing
In [50]: enc = preprocessing.OneHotEncoder()
In [51]: enc.fit(df.as_matrix()).transform(df.as_matrix()).toarray()
Out[51]: 
array([[ 1.,  0.,  1.,  0.,  0.],
       [ 1.,  0.,  1.,  0.,  0.],
       [ 0.,  1.,  0.,  1.,  0.],
       [ 0.,  1.,  0.,  0.,  1.]])

有两点需要注意:

  1. toarray()使基体再次致密化;当然,它的使用是可选的

  2. 根据结构,最后一列必然是num的"100及以上"类别。您可以根据需要保留或删除此列

相关内容

  • 没有找到相关文章

最新更新