假设我有一个列表(或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中找到它的索引。只是想知道是否有直接的方法?
答案 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
不熟悉,所以我不能这样说。