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

时间:2016-09-02 11:38:22

标签: python csv pandas scikit-learn

我有一个csv文件,我用

读到
import pandas
df = pd.read_csv("inputfile")

有些列是数字的,有些是字符串。让我们调用其中一个数字列'num'和一个字符串'col'。我想做以下事情:

  1. 我希望能够对名为'col'的字符串列进行一次热编码,并生成一个包含所有功能的稀疏矩阵。
  2. 我想热身编码df['num']但仅限于df['num'] < 100
  3. 如果输入位于词典列表中,这很容易做到。

    步骤1。在您运行DictVectorizer

    时自动发生

    第2步。只需要我迭代字典,在必要时为新字符串功能'num_cat'添加键/值对,然后在全新的字典列表上运行DictVectorizer

    我坚持跟随:

    • 我需要一个热编码产生的矩阵是稀疏的。如果有大量类别,pd.get_dummies非常慢。它是否会创建一个密集的矩阵然后使其稀疏?结果我觉得我不能用它。
    • 如果不首先将数据框转换为字典列表然后运行DictVectorizer,我可以做我需要的吗?如果没有,是否有简单的方法进行转换?

1 个答案:

答案 0 :(得分:3)

假设您从

开始
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及以上”类别。您可以根据需要保留它或删除此列。