我应该如何转换 scikit-learn 管道中的多个 key/value 列?
How should I transform multiple key/value columns in a scikit-learn pipeline?
我想构建一个 sklearn 管道来转换包含多个 key/value 对的数据:
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
似乎是合适的,但我正在努力将每行中存在的多个 key/value 列转换为适合处理的字典。
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.]])
如上所示,什么是合适的自定义转换器来转换多个 key/value 对?
基于 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 等)相同,并且列数为偶数。
我不知道特殊的转换器,但你可以使用简单的列表理解:
>>> 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.]]
我想构建一个 sklearn 管道来转换包含多个 key/value 对的数据:
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
似乎是合适的,但我正在努力将每行中存在的多个 key/value 列转换为适合处理的字典。
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.]])
如上所示,什么是合适的自定义转换器来转换多个 key/value 对?
基于 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 等)相同,并且列数为偶数。
我不知道特殊的转换器,但你可以使用简单的列表理解:
>>> 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.]]