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

python,对数字/字符串列表进行排序(将列表元素转换为序号值),python,numpy,pandas,Python,Numpy,Pandas,假设我有一个列表(或numpy数组或熊猫系列),如下所示 我想返回每个值的序号列表,1-->1(最小)、2-->2、4-->3、6-->4和 我希望它也适用于字符串列表输入 我可以试试 s = numpy.unique(l) 然后在l中的每个元素上循环,并在s中找到它的索引。想知道是否有直接方法?在pandas中,您可以调用并传递method='dense': In [18]: l = [1,2,6,6,4,2,4] s = pd.Series(l) s.rank(method='dense'

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

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

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

我可以试试

s = numpy.unique(l)
然后在l中的每个元素上循环,并在s中找到它的索引。想知道是否有直接方法?

在pandas中,您可以调用并传递
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。我能想到的最直接的方法是对一组元素进行排序:

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
中的任何内容。我对熊猫不太熟悉,所以我不能这么说。

FYI:你也可以使用
scipy.stats.rankdata
()。
ordinal_map = {val: i for i, val in enumerate(sorted_unique, 1)}
ordinals = [ordinal_map[val] for val in l]