Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Pandas-用numpy数组替换分类文本,用于机器学习_Pandas_Scikit Learn - Fatal编程技术网

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

Pandas-用numpy数组替换分类文本,用于机器学习,pandas,scikit-learn,Pandas,Scikit Learn,我有一个文件: data = pd.read('data.csv') 该文件包含关于数字用户的分类文本数据,例如:(source='google',facebook',twitter')和(country='US','FR','GER') 使用sklearn.feature\u extraction.DictVectorizer()类,我成功地将这些类别转换为numpy数组。然后,我创建了一个字典,其中包含文本类别作为键,相关类别的矢量化numpy数组作为值,即: {'google': np.

我有一个文件:

data = pd.read('data.csv')
该文件包含关于数字用户的分类文本数据,例如:(source='google',facebook',twitter')和(country='US','FR','GER')

使用
sklearn.feature\u 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.])}
理想情况下,我想做的是将每个文本类别(例如,“google”)替换为它的矢量化numpy数组值(例如,
np.array([0,0,0,0,1.]
),这样我就可以使用特征缩减算法将特征缩减为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.])

有人能推荐最好的方法吗?

因此我找到了解决问题的“a”解决方案,可能不是“the”解决方案。我回去为我的键、值对制作了新的词典:

创建列表以在以下位置存储键、值:

keys = []
values = []
将键和值添加到列表:

for column in category_columns:
    keys.append(data[column].unique().tolist())
for matrix in vectorized_data:
    values.append(matrix)
结果(继续上面的例子):

创建包含键、值的字典列表:

unique_vect = []
for i in range(0, len(keys)):
    unique_vect.append(dict(zip(keys[i], values[i])))
然后,我使用pandas的
.map()
函数将现有值替换为我从
DictVectorizer创建的numpy数组

data['affiliate_channel'] = data['affiliate_channel'].map(unique_vect[0].get)
我对每一列重复了这个步骤


一点点脑力和几个小时的谷歌就能做到这一点,真是太神奇了。如果有人能想出一种更好/更快/更具蟒蛇风格的方法,我将不胜感激。

也许这是一种更简洁的操作,可以将范畴转换为数字表示。自从我使用R mostl以来,我不得不对它进行一些复习最近很忙。这是一个很好的资源

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的
df.T
给出了转置,然后我们将
应用到dict()
以获得DictVectorizer需要的字典列表。
values()
方法只返回值,我们不需要索引

根据规定:

 [{'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\u feature\u names()
允许我们从矢量器中检索此数组的列名,如果我们要检查结果的话

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

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

great answer@Seth\u p
vectorizer.get_feature_names()
['source=facebook',
 'source=google',
 'source=twitter',
 'country=FR',
 'country=GER',
 'country=US']