如何查找已排序系列的索引?

时间:2017-12-11 19:32:28

标签: python pandas numpy

我怀疑我误解了什么。

  

问题:给定一个系列,我想返回一个新系列的值   如果该系列已经排序,那么每一行都是索引。

我发布了一个不同的问题,似乎argsort是正确的解决方案。但在阅读了关于argsort之后,我相信事实并非如此。这是doc

  

返回对数组进行排序的索引。

以下是一个例子:

test = pd.Series(np.random.randint(20, size=10), index=['red', 'green', 'yellow', 'purple', 'orange', 'white', 'black', 'pink', 'brown', 'gray'])
>>> test
red        2
green     17
yellow     8
purple    19
orange    12
white      0
black     15
pink       5
brown     14
gray      14

>>> test.argsort()
red       5
green     0
yellow    7
purple    2
orange    4
white     8
black     9
pink      6
brown     1
gray      3

但我真正想要的是每种颜色的索引,就好像它已经分类一样。例如,如果我test.sort_values()

>>> test.sort_values()
white      0
red        2
pink       5
yellow     8
orange    12
brown     14
gray      14
black     15
green     17
purple    19
dtype: int64

这是有道理的,因为它会产生与test[test.argsort()]相同的结果。

那么我该怎么做才能得到类似的东西?

red       1
green     8
yellow    3
purple    9
orange    4
white     0
black     7
pink      2
brown     5
gray      6

Numpy argsort - what is it doing?类似的问题,但我认为它没有回答我想要的功能。

我希望这是有道理的。

2 个答案:

答案 0 :(得分:1)

我们可以使用rank

test.rank(method ='first')-1
Out[917]: 
red       1.0
green     8.0
yellow    3.0
purple    9.0
orange    4.0
white     0.0
black     7.0
pink      2.0
brown     5.0
gray      6.0
Name: tt, dtype: float64

答案 1 :(得分:0)

看起来我在那篇文章中错过了答案。做argsort两次是最好的答案。

test.argsort().argsort()

说明:

  

第一个argsort返回一个排列(如果应用于数据将对其进行排序)。当argsort应用于(this或任何)置换时,它返回逆置换(如果2个置换以任一顺序相互应用,则结果为Identity)。如果应用于排序数据数组,则第二个排列将产生未排序的数据数组,即它是排名

%timeit test.argsort().argsort()
The slowest run took 7.49 times longer than the fastest. This could mean that an intermediate result is being cached.
10000 loops, best of 3: 146 µs per loop
%timeit test.rank(method='first').astype(int) - 1
1000 loops, best of 3: 234 µs per loop

这表明argsort()是更小的数据。

相关问题