(Python)使用sklearn类中带字符串的DictVectorier

(Python)使用sklearn类中带字符串的DictVectorier,python,pandas,scikit-learn,Python,Pandas,Scikit Learn,为我期望的简单问题/答案提前道歉。python和SKL新手,请在此学习。我有一个变量(熊猫数据框列),它是一个unicode字符串列表。我想使用sklearn中的DictVectorizer类将其解压到一个热编码矩阵中,其中每列都是一个可能的字符串值,矩阵中的每个值都是一个二进制值,指示该值是否存在于该列表中 DictVectorizer文档中的示例如下: #来自sklearn.feature_提取导入DictVectorizer的文档示例 v=矢量化器(稀疏=假) D=[{'foo':1,'b

为我期望的简单问题/答案提前道歉。python和SKL新手,请在此学习。我有一个变量(熊猫数据框列),它是一个unicode字符串列表。我想使用sklearn中的
DictVectorizer
类将其解压到一个热编码矩阵中,其中每列都是一个可能的字符串值,矩阵中的每个值都是一个二进制值,指示该值是否存在于该列表中

DictVectorizer
文档中的示例如下:

#来自sklearn.feature_提取导入DictVectorizer的文档示例
v=矢量化器(稀疏=假)
D=[{'foo':1,'bar':2},{'foo':3,'baz':1}]
X=v.fit_变换(D)
X
这将返回承诺的矢量化数组,但在我的例子中,我想向它传递一个unicode字符串列表,例如:

#我的案子
D=[[u“foo”,u“bar”],[u“foo”]]
X=v.fit_变换(D)
这里我得到一个错误

---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-48-6a41384fcd8f> in <module>()
      1 # my case
      2 D = [[u"foo", u"bar"], [u"foo"]]
----> 3 X = v.fit_transform(D)

/opt/conda/lib/python2.7/site-packages/sklearn/feature_extraction/dict_vectorizer.pyc in fit_transform(self, X, y)
    224             Feature vectors; always 2-d.
    225         """
--> 226         return self._transform(X, fitting=True)
    227 
    228     def inverse_transform(self, X, dict_type=dict):

/opt/conda/lib/python2.7/site-packages/sklearn/feature_extraction/dict_vectorizer.pyc in _transform(self, X, fitting)
    160         # same time
    161         for x in X:
--> 162             for f, v in six.iteritems(x):
    163                 if isinstance(v, six.string_types):
    164                     f = "%s%s%s" % (f, self.separator, v)

/opt/conda/lib/python2.7/site-packages/sklearn/externals/six.pyc in iteritems(d, **kw)
    437 def iteritems(d, **kw):
    438     """Return an iterator over the (key, value) pairs of a dictionary."""
--> 439     return iter(getattr(d, _iteritems)(**kw))
    440 
    441 def iterlists(d, **kw):

AttributeError: 'list' object has no attribute 'iteritems'
---------------------------------------------------------------------------
AttributeError回溯(最近一次呼叫上次)
在()
我的案子
2D=[[u“foo”,u“bar”],[u“foo”]]
---->3 X=v.fit_变换(D)
/opt/conda/lib/python2.7/site-packages/sklearn/feature_extraction/dict_vectorizer.pyc in fit_transform(self,X,y)
224个特征向量;总是二维的。
225         """
-->226返回自。_变换(X,拟合=真)
227
228 def逆变换(self,X,dict_type=dict):
/opt/conda/lib/python2.7/site-packages/sklearn/feature_extraction/dict_vectorizer.pyc in_transform(self,X,fitting)
160#同时
161对于x中的x:
-->f为162,v为六。iteritems(x):
163如果存在(v,六个字符串类型):
164 f=“%s%s%s”%(f,self.separator,v)
/iteritems中的opt/conda/lib/python2.7/site-packages/sklearn/externals/six.pyc(d,**千瓦)
437 def iteritems(d,**kw):
438“返回字典(键、值)对的迭代器。”“”
-->439返回iter(getattr(d,_iteritems)(**kw))
440
441 def iterlists(d,**kw):
AttributeError:“list”对象没有属性“iteritems”

@EdChum的回答帮助我解决了这个问题。我认为下面的内容可能会解决这个问题

from collections import Counter
D = [[u"foo", u"bar"], [u"foo"]]
q = dict(Counter(x for xs in D for x in set(xs)))
X = v.fit_transform(q)

我正在将类型更改为
fit_transform
所期望的类型。即
字典
。我知道它很晚了,但由于此线程在“DictVectorizer fit_transform”上以高优先级打开“搜索结果,我想它可能会帮助一些人。如果可能,请评论它是否解决了问题。

如评论和@Muthu的回答中所述,
dictvectorier
的输入格式为dict

from collections import Counter
D = [[u"foo", u"bar"], [u"foo"]]
q = dict(Counter(x for xs in D for x in set(xs)))
X = v.fit_transform(q)
如果元素计数使用
计数器
或者如果需要将其作为一个热编码,请在
lambda
函数中使用
set

import pandas as pd
from collections import Counter
from sklearn.feature_extraction import DictVectorizer

D = [[u"foo", u"bar"], [u"foo"]]
df = pd.DataFrame({'my_col': D})

x = df['my_col'].apply(lambda x: dict(Counter(x)))
DictVectorizer(sparse=False).fit_transform(x)

#array([[1., 1.],
#       [0., 1.]])

错误很明显,您试图在列表列表上使用dict向量器,因此需要转换类型谢谢@EdChum您是否介意帮助我进一步了解如何转换类型?文档说明您需要传递dict,其中键是字符串,值是索引位置,假设您可以传递一系列字符串,但不清楚数据的真正形式