为Scikit-Learn矢量化Pandas数据帧

Ame*_*ina 17 python pandas scikit-learn

假设我在Pandas中有一个数据帧,如下所示:

> my_dataframe

col1   col2
A      foo
B      bar
C      something
A      foo
A      bar
B      foo
Run Code Online (Sandbox Code Playgroud)

其中,行代表实例,列输入功能(未显示有目标的标签,但这将是一个分类任务),也就是我试图建立X出来的my_dataframe.

我怎样才能有效地使用例如DictVectorizer

我是否需要先将DataFrame中的每个条目转换为字典?(这就是上面链接示例中的方式).有没有更有效的方法来做到这一点?

alk*_*lko 21

首先,我没有得到样本数组中的哪些特征,以及观察结果.

其次,不DictVectorizer保留数据,仅涉及转换实用程序和元数据存储.转换后,它存储功能名称和映射.它返回一个numpy数组,用于进一步的计算.Numpy数组(特征矩阵)大小等于features countx number of observations,其值等于观察的特征值.因此,如果您了解自己的观察和特征,则可以按照自己喜欢的方式创建此阵列.

如果你希望sklearn为你做,你不必手动重建dict,因为它可以to_dict应用于转置数据帧:

>>> df
  col1 col2
0    A  foo
1    B  bar
2    C  foo
3    A  bar
4    A  foo
5    B  bar
>>> df.T.to_dict().values()
[{'col2': 'foo', 'col1': 'A'}, {'col2': 'bar', 'col1': 'B'}, {'col2': 'foo', 'col1': 'C'}, {'col2': 'bar', 'col1': 'A'}, {'col2': 'foo', 'col1': 'A'}, {'col2': 'bar', 'col1': 'B'}]
Run Code Online (Sandbox Code Playgroud)

自scikit-learn 0.13.0(2014年1月3日)以来'records',该to_dict()方法有一个新参数,所以现在您可以简单地使用此方法而无需额外的操作:

>>> df = pandas.DataFrame({'col1': ['A', 'B', 'C', 'A', 'A', 'B'], 'col2': ['foo', 'bar', 'foo', 'bar', 'foo', 'bar']})
>>> df
  col1 col2
0    A  foo
1    B  bar
2    C  foo
3    A  bar
4    A  foo
5    B  bar
>>> df.to_dict('records')
[{'col2': 'foo', 'col1': 'A'}, {'col2': 'bar', 'col1': 'B'}, {'col2': 'foo', 'col1': 'C'}, {'col2': 'bar', 'col1': 'A'}, {'col2': 'foo', 'col1': 'A'}, {'col2': 'bar', 'col1': 'B'}]
Run Code Online (Sandbox Code Playgroud)


Mat*_*att 11

看看sklearn-pandas它提供了您正在寻找的东西.相应的Github回购就在这里.


Kri*_*ris 6

你绝对可以使用DictVectorizer.因为DictVectorizer需要可迭代的dict类似对象,所以可以执行以下操作:

from sklearn.base import TransformerMixin
from sklearn.pipeline import make_pipeline
from sklearn.feature_extraction import DictVectorizer


class RowIterator(TransformerMixin):
    """ Prepare dataframe for DictVectorizer """
    def fit(self, X, y=None):
        return self

    def transform(self, X):
        return (row for _, row in X.iterrows())


vectorizer = make_pipeline(RowIterator(), DictVectorizer())

# now you can use vectorizer as you might expect, e.g.
vectorizer.fit_transform(df)
Run Code Online (Sandbox Code Playgroud)