将分类变量从String转换为int表示

时间:2016-12-10 16:59:45

标签: pandas numpy scikit-learn

我有一个以字符串数组形式的文本分类的numpy数组,即 y_train = ['A', 'B', 'A', 'C',...]。我正在尝试应用SKlearn多项式NB算法来预测整个数据集的类。

我想将String类转换为整数,以便能够输入算法并将['A', 'B', 'A', 'C', ...]转换为['1', '2', '1', '3', ...]

我可以编写一个for循环来遍历数组并使用int分类器创建一个新的但是有一个直接函数来实现这个

3 个答案:

答案 0 :(得分:7)

尝试factorize方法:

In [264]: y_train = pd.Series(['A', 'B', 'A', 'C'])

In [265]: y_train
Out[265]:
0    A
1    B
2    A
3    C
dtype: object

In [266]: pd.factorize(y_train)
Out[266]: (array([0, 1, 0, 2], dtype=int64), Index(['A', 'B', 'C'], dtype='object'))

演示:

In [271]: fct = pd.factorize(y_train)[0]+1

In [272]: fct
Out[272]: array([1, 2, 1, 3], dtype=int64)

答案 1 :(得分:3)

如果您正在使用sklearn,我建议您坚持使用该库中为您执行这些操作的方法。 Sklearn有许多预处理数据的方法,例如编码标签。其中一个是def check_for_number(list): x = 0 print(isinstance(list[x], (int, float)) true_or_false = False for x in range(len(list)-1): if isinstance(list[x], (int, float) == True): # missing a parenthesis to close isinstance. # "== True" is unnecessary because isinstance() will resolve to True or False true_or_false = True num = list[x] x += 1 print(true_or_false) return true_or_false return num # this will result in unexpected behavior... # ...because num will not be defined if this line is reached. # Either the return inside the if will finish the method or num will never be defined. 函数。

sklearn.preprocessing.LabelEncoder

哪个输出

from sklearn.preprocessing import LabelEncoder  

le = LabelEncoder()
le.fit_transform(y_train)

使用array([0, 1, 0, 2]) 映射回来

答案 2 :(得分:0)

另一种方法是使用数据帧的astype('category')。cat.codes将字符串值转换为数字

X=df[['User ID', 'Gender', 'Age', 'EstimatedSalary']]
X['Gender']=X['Gender'].astype('category').cat.codes