python,对数字/字符串列表进行排序(将列表元素转换为序号值)
假设我有一个列表(或numpy数组或熊猫系列),如下所示 我想返回每个值的序号列表,1-->1(最小)、2-->2、4-->3、6-->4和 我希望它也适用于字符串列表输入 我可以试试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'
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]