Python 我应该如何转换scikit学习管道中的多个键/值列?

Python 我应该如何转换scikit学习管道中的多个键/值列?,python,pandas,scikit-learn,Python,Pandas,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 似乎很合适,但我正在努力将每行上的多个键/值列转换为适合处理的dict DictVect

我想构建一个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
似乎很合适,但我正在努力将每行上的多个键/值列转换为适合处理的dict

DictVectorizer
似乎适合这样输入:

row1 = {'a':1, 'b':2}
row2 = {'b':2, 'c':3}
data = [row1, row2]
# This is the output structure that I need:
print(data)
DictVectorizer( sparse=False ).fit_transform(data)
>>> v = sklearn.feature_extraction.DictVectorizer(sparse=False)
>>> X = v.fit_transform(data)
>>> print X
[[ 1.  2.  0.]
 [ 0.  2.  3.]]
屈服:

[{'a': 1, 'b': 2}, {'c': 3, 'b': 2}]
然后它将转换为如下数组:

row1 = {'a':1, 'b':2}
row2 = {'b':2, 'c':3}
data = [row1, row2]
# This is the output structure that I need:
print(data)
DictVectorizer( sparse=False ).fit_transform(data)
>>> v = sklearn.feature_extraction.DictVectorizer(sparse=False)
>>> X = v.fit_transform(data)
>>> print X
[[ 1.  2.  0.]
 [ 0.  2.  3.]]
最终输出:

array([[ 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}]
这将产生以下结果:

[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等),列数为偶数。

我不知道特殊的变压器,但您可以使用简单的列表理解:

>>> data = [{row['k1']:row['v1'], row['k2']:row['v2']} for index, row in D.iterrows()]
>>> data
[{'a': 1, 'b': 2}, {'c': 3, 'b': 2}]
从这里,您可以使用如下dict矢量器:

row1 = {'a':1, 'b':2}
row2 = {'b':2, 'c':3}
data = [row1, row2]
# This is the output structure that I need:
print(data)
DictVectorizer( sparse=False ).fit_transform(data)
>>> v = sklearn.feature_extraction.DictVectorizer(sparse=False)
>>> X = v.fit_transform(data)
>>> print X
[[ 1.  2.  0.]
 [ 0.  2.  3.]]

那么,为了澄清一下,您希望将包含这些K/V列对的pandas数据帧转换为字典列表?是的。我正结结巴巴地讲着来自R背景的python语言。抱歉。我根据您的方法实现了一个转换器:。为了让它能够使用一组可配置的列,我对它进行了一些调整。谢谢大家!@BradDixon很漂亮的东西!