pandas的argsort是如何工作的?我如何解释其结果?

3

I have the following pandas series:

>>>ser
num  let
0    a      12
     b      11
     c      18
1    a      10
     b       8
     c       5
2    a       8
     b       9
     c       6
3    a      15
     b      10
     c      11

当我使用argsort时,我会得到以下结果:
>>>ser.argsort()
num  let
0    a       5
     b       8
     c       4
1    a       6
     b       7
     c       3
2    a      10
     b       1
     c      11
3    a       0
     b       9
     c       2

我不太理解。ser[(1, 'c')] 不应该是从 argsort 中获得最低值吗?

而且,按照 ser.argsort() 的顺序排序似乎也很奇妙:

>>>ser.iloc[ser.argsort()]
num  let
1    c       5
2    c       6
1    b       8
2    a       8
     b       9
1    a      10
3    b      10
0    b      11
3    c      11
0    a      12
3    a      15
0    c      18

希望能得到您的帮助来解决这个问题,非常感谢。

2个回答

3
根据文档:https://pandas.pydata.org/pandas-docs/stable/generated/pandas.Series.argsort.html pd.Series.argsort()np.ndarray.argsort()作用相同,即 (https://docs.scipy.org/doc/numpy/reference/generated/numpy.argsort.html#numpy-argsort) "返回的是排序后的数组的索引"。
它将Series替换为按照索引应该出现的顺序,以查看排序后的Series。这就是为什么当你调用ser.iloc[ser.argsort()]时,会得到一个排序后的Series。
如果您在寻找一种简单的方法来按值对系列进行排序,为什么不直接使用ser.sort_values()
对于ser.argsort()[(1, 'c')]返回结果的混淆是可以理解的。 您可能期望它返回ser[(1,'c')]在排序后的位置,但实际上并不是这样。 ser.argsort()[(1, 'c')]执行的操作是: 1. 一旦完成argsort,那么现在位于(1,'c')的值的旧的位置索引是多少。 2. 排序后的Series中,原始(1,'c')位置的值是(1,'b'),即ser.iloc[3],因此您得到3。
这一点并不直观,但确实如此! argsort返回一个与初始Series具有相同索引的Series(因此可以使用.iloc),但其值已替换为排序的值的先前位置。

这真的没有回答我的问题。由于 min(ser) = ser[(1, 'c')] = 5,我期望 ser.argsort()[(1, 'c')] 等于0(即在排序后的序列中是第一个值)。 - Eran
我已经添加了一些解释,但我认为COLDSPEED比我更简洁地概括了它! - greg_data
确实。我对于 ser.argsort() 返回原始索引感到困惑,我认为这非常不幸 :) - Eran
这个方法让人感到困惑,我很难看出它的实用性,但我相信它一定有。可能可以加快对非常大的Series对象进行排序的速度?https://imgur.com/a/yVRIw - greg_data
1
我认为它主要适用于根据另一个系列对一个系列进行排序。我不认为它比ser.sort_values()更快。 - Eran
1
我认为使用pandas更好地从输出中删除索引,因为它们只会造成混乱。 - Eran

2
不,这不是 argsort 的工作方式。 argsort 告诉你该元素在原始列表中的位置。如果查看 argsort 排序后的索引,您会发现第一个元素属于原始序列中的索引 5。如果查看第 5 个索引,您会发现它是 5,这确实是最小值。以此类推。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接