我怀疑我误解了什么。
问题:给定一个系列,我想返回一个新系列的值 如果该系列已经排序,那么每一行都是索引。
我发布了一个不同的问题,似乎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?类似的问题,但我认为它没有回答我想要的功能。
我希望这是有道理的。
答案 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()
是更小的数据。