我用
读取了一个csv文件import pandas
df = pd.read_csv("inputfile")
有些列是数字,有些是字符串。我们称其中一列为数字列'num'
,另一列为字符串列'col'
。我想做以下事情:
- 我想能够一个热编码一个字符串列称为
'col'
,并导致稀疏矩阵与它的所有特征。 - 我想单热编码
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.]])
有两点需要注意:
toarray()
使基体再次致密化;当然,它的使用是可选的根据结构,最后一列必然是
num
的"100及以上"类别。您可以根据需要保留或删除此列