如何在scikit-learn管道中转换多个键/值列



我想构建一个sklearn管道来转换包含多个键/值对的数据:

import pandas as pd
D = pd.DataFrame([ ['a', 1, 'b', 2], ['b', 2, 'c', 3]], columns = ['k1', 'v1', 'k2', 'v2'])
print(D)
输出:

  k1  v1 k2  v2
0  a   1  b   2
1  b   2  c   3

DictVectorizer似乎是合适的,但我正在努力将每一行上存在的多个键/值列转换为适合处理的字典。

DictVectorizer似乎可以这样输入:

row1 = {'a':1, 'b':2}
row2 = {'b':2, 'c':3}
data = [row1, row2]
# This is the output structure that I need:
print(data)
收益率

:

[{'a': 1, 'b': 2}, {'c': 3, 'b': 2}]

然后它将转换成如下的数组:

DictVectorizer( sparse=False ).fit_transform(data)
最终输出:

array([[ 1.,  2.,  0.],
       [ 0.,  2.,  3.]])

如上面所示,转换多个键/值对的合适自定义转换器是什么?

我不知道有什么特殊的转换器,但是你可以使用一个简单的列表推导:

>>> data = [{row['k1']:row['v1'], row['k2']:row['v2']} for index, row in D.iterrows()]
>>> data
[{'a': 1, 'b': 2}, {'c': 3, 'b': 2}]

从这里你可以使用像这样的字典矢量器:

>>> v = sklearn.feature_extraction.DictVectorizer(sparse=False)
>>> X = v.fit_transform(data)
>>> print X
[[ 1.  2.  0.]
 [ 0.  2.  3.]]

以Mike的回答为基础(这肯定比我原来的回答更优雅),您可以使用相同的列对逻辑,并且不必使用以下命令指定每对列:

[dict((row[i-1],row[i]) for i in np.arange(1,len(D.columns),2)) for index, row in D.iterrows() ]

结果如下:

[{'a': 1, 'b': 2}, {'c': 3, 'b': 2}]

注意:这假设对的组织方式与您的示例(k1,v1,k2,v2等)一样,并且有偶数列。

相关内容

  • 没有找到相关文章

最新更新