用数字替换字符串numpy数组

时间:2018-02-18 14:45:59

标签: python pandas numpy

我有一个numpy数组

z = array(['Iris-setosa', 'Iris-setosa', 'Iris-setosa', 'Iris-setosa','Iris-versicolor', 'Iris-versicolor', 'Iris-versicolor','Iris-virginica', 'Iris-virginica', 'Iris-virginica'])

我想替换

Iris-setosa -0
Iris-versicolor - 1
Iris-virginica - 2

应用逻辑回归。

最终输出应该是

z = [ 0, 0 ,.. 1,1,.. 2,2,..]

是否有一种简单的方法来执行此操作,而不是遍历数组并使用replace命令?

4 个答案:

答案 0 :(得分:5)

使用factorize

a = pd.factorize(z)[0].tolist()
print (a)
[0, 0, 0, 0, 1, 1, 1, 2, 2, 2]

numpy.unique

a = np.unique(z, return_inverse=True)[1].tolist()
print (a)
[0, 0, 0, 0, 1, 1, 1, 2, 2, 2]

答案 1 :(得分:2)

你可以使用字典:

my_dict = {'Iris-setosa': 0, 'Iris-versicolor': 1, 'Iris-virginica': 2}

然后使用list comprehension:

z = [my_dict[zi] for zi in z]

答案 2 :(得分:0)

您是否在尝试进行逻辑回归时计算出现次数?

如果是,您也可以使用以下内容。

import collections
z = ['Iris-setosa', 'Iris-setosa', 'Iris-setosa', 'Iris-setosa','Iris-versicolor', 'Iris-versicolor', 'Iris-versicolor','Iris-virginica', 'Iris-virginica', 'Iris-virginica']
print (collections.Counter(z))

将打印如下:

Counter({'Iris-setosa': 4, 'Iris-versicolor': 3, 'Iris-virginica': 3})

如果您想以其他方式打印,可以执行以下操作:

import collections
z = ['Iris-setosa', 'Iris-setosa', 'Iris-setosa', 'Iris-setosa','Iris-versicolor', 'Iris-versicolor', 'Iris-versicolor','Iris-virginica', 'Iris-virginica', 'Iris-virginica']
for item in collections.Counter(z):
    print(str(item)+ ' ' + str(collections.Counter(z)[item]))

输出

Iris-setosa 4
Iris-versicolor 3
Iris-virginica 3

答案 3 :(得分:-1)

[list(set(z)).index(val) for val in z]

简单地说,从z中投出一组来获得唯一的值,然后从该集合中列出一个列表用于索引,然后最终使用列表推导来获得最终列表。如果你有一个非常大的字符串列表,我建议将列表(set(z))设置为列表理解之外的变量