python,排名数字/字符串列表(将列表元素转换为序数值)

时间:2015-09-18 15:20:54

标签: python numpy pandas

假设我有一个列表(或numpy数组或pandas系列),如下所示

l = [1,2,6,6,4,2,4]

我想返回每个值序数的列表,1 - > 1(最小),2 - > 2,4 - > 3,6 - > 4和

to_ordinal(l) == [1,2,4,4,3,2,4]

我希望它也适用于字符串输入列表。

我可以尝试

s = numpy.unique(l)

然后遍历l中的每个元素并在s中找到它的索引。只是想知道是否有直接的方法?

2 个答案:

答案 0 :(得分:3)

在大熊猫中,您可以拨打rank并传递method='dense'

In [18]:
l = [1,2,6,6,4,2,4]
s = pd.Series(l)
s.rank(method='dense')
Out[18]:
0    1
1    2
2    4
3    4
4    3
5    2
6    3
dtype: float64

这也适用于字符串:

In [19]:
l = ['aaa','abc','aab','aba']
s = pd.Series(l)

Out[19]:
0    aaa
1    abc
2    aab
3    aba
dtype: object

In [20]:
s.rank(method='dense')

Out[20]:
0    1
1    4
2    2
3    3
dtype: float64

答案 1 :(得分:1)

我不认为这个 1 有“直接方法”。我能想到的最直接的方法是对一组元素进行排序:

sorted_unique = sorted(set(l))

然后创建一个字典,将值映射到它的序数:

ordinal_map = {val: i for i, val in enumerate(sorted_unique, 1)}

现在再次传递数据,我们可以获取您的列表:

ordinals = [ordinal_map[val] for val in l]

请注意,这是一个大致O(NlogN)算法(由于排序) - 您拥有的非唯一元素越多,它就越接近O(N)

1 当然不是在香草python中,我不知道numpy中的任何内容。我对pandas不熟悉,所以我不能这样说。