我有一个csv文件,我用
读到import pandas
df = pd.read_csv("inputfile")
有些列是数字的,有些是字符串。让我们调用其中一个数字列'num'
和一个字符串'col'
。我想做以下事情:
'col'
的字符串列进行一次热编码,并生成一个包含所有功能的稀疏矩阵。df['num']
但仅限于df['num'] < 100
。如果输入位于词典列表中,这很容易做到。
步骤1。在您运行DictVectorizer
时自动发生 第2步。只需要我迭代字典,在必要时为新字符串功能'num_cat'
添加键/值对,然后在全新的字典列表上运行DictVectorizer
我坚持跟随:
答案 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.]])
有两点需要注意:
toarray()
使矩阵再次密集;当然,它的使用是可选的。
通过构建,最后一列必须是num
的“100及以上”类别。您可以根据需要保留它或删除此列。