Pandas - 用机器学习的numpy数组替换分类文本

时间:2016-01-12 02:31:16

标签: pandas scikit-learn

我有一个文件:

data = pd.read('data.csv')

该文件包含有关数字用户的分类文本数据,例如:(来源='谷歌','脸谱','推特')和(country = ' US',' FR',' GER')。

使用sklearn.feature_extraction.DictVectorizer()类,我设法将这些类别转换为numpy数组。然后我创建了一个字典,其中包含文本类别作为键,以及相关类别的矢量化numpy数组作为值,即:

{'google': np.array([0.,  0.,  0.,  0.,  1.])}
{'facebook': np.array([1., 0., 0., 0., 0.])}
{'FR': np.array([0., 0., 1.])}

我理想的做法是用它的矢量化numpy数组值(例如np.array([0., 0., 0., 0., 1.])替换每个文本类别(例如,' google'),以便我然后可以使用特征缩减算法将特征减少到2,以实现可视化目的。

理想情况下,数据中的一行显示为:

source | country 
google | FR
twitter| US

请阅读:

source                             | country
np.array([0.,  0.,  0.,  0.,  1.]) | np.array([0., 0., 1.])
np.array([1.,  0.,  0.,  0.,  0.]) | np.array([1., 0., 0.])

有人可以推荐最好的方法吗?

2 个答案:

答案 0 :(得分:1)

也许这是将分类转换为数字表示的更简洁的操作。自从我最近一直在使用R以来,我不得不对它进行一点研究。 This blog post是一个很好的资源。

import pandas as pd
from sklearn.feature_extraction import DictVectorizer

d = {'source' : pd.Series(['google', 'facebook', 'twitter','twitter'],
                          index=['1', '2', '3', '4']),
     'country' : pd.Series(['GER', 'GER', 'US', 'FR'], 
                           index=['1', '2', '3', '4'])}
df = pd.DataFrame(d)
df_as_dicts=df.T.to_dict().values()

df.T给出转置,然后我们应用to_dict()来获取DictVectorizer想要的词典列表。 values()方法只返回值,我们不需要索引。

df_as_dicts:

 [{'source': 'google', 'country': 'GER'},
 {'source': 'twitter', 'country': 'US'},
 {'source': 'facebook', 'country': 'GER'},
 {'source': 'twitter', 'country': 'FR'}]

然后使用DictVectorizer进行转换:

vectorizer = DictVectorizer( sparse = False )
d_as_vecs = vectorizer.fit_transform( df_as_dicts )

导致:

array([[ 0.,  1.,  0.,  0.,  1.,  0.],
       [ 0.,  0.,  1.,  0.,  0.,  1.],
       [ 1.,  0.,  0.,  0.,  1.,  0.],
       [ 0.,  0.,  1.,  1.,  0.,  0.]])
如果我们想检查结果,

get_feature_names()允许我们从矢量化器中检索此数组的列名。

vectorizer.get_feature_names()
['source=facebook',
 'source=google',
 'source=twitter',
 'country=FR',
 'country=GER',
 'country=US']

我们可以确认转换为我们提供了一种热编码形式的测试数据的正确表示。

答案 1 :(得分:0)

所以我找到了' a'解决我的问题,也许不是''解。我回去做了我的关键值对的新词典:

创建列表以存储键,值为:

keys = []
values = []

向列表添加键和值:

for column in category_columns:
    keys.append(data[column].unique().tolist())
for matrix in vectorized_data:
    values.append(matrix)

结果(继续上面的例子):

keys = ['google', 'facebook', 'twitter']
values = [np.array([0.,  0.,  0.,  0.,  1.]), np.array([1.,  0.,  0.,  0.,  0.]), np.array([0.,  1.,  0.,  0.,  0.])]

使用键创建一个词典列表,值:

unique_vect = []
for i in range(0, len(keys)):
    unique_vect.append(dict(zip(keys[i], values[i])))

然后我用了熊猫' .map()函数用我从DictVectorizer

创建的numpy数组替换现有值
data['affiliate_channel'] = data['affiliate_channel'].map(unique_vect[0].get)

我为每一栏重复了这一步。

令人惊讶的是,一点点的脑力,以及几个小时的谷歌可以做到的。如果有人能想到更好/更快/更多Pythonic的方式来做到这一点,我会很感激。