奇怪的pd.Series.argsort结果

时间:2017-10-16 08:33:34

标签: python pandas

我有以下熊猫系列:

>>>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

我真的不明白。不应该从[argsort]获得最低值[(1,' c')]?

我更加困惑的是,根据ser.argsort()排序ser如何像魅力一样工作:

>>>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 个答案:

答案 0 :(得分:2)

根据文档: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()]时,你会得到一个排序的系列。

如果您正在寻找一种按值排序系列的简单方法,为什么不使用ser.sort_values()

ser.argsort()[(1, 'c')]返回的混淆是可以理解的。

您可能希望它在排序后返回ser[(1,'c')]的位置,但这不是它尝试做的事情。

ser.argsort()[(1, 'c')]正在做的是:

  • 一旦我们执行了argsort,那么现在位于位置索引的值的位置索引是多少(1,& #39; C')

  • 对系列进行排序后,其中(1,' c')之前的值为(1,' b'),即ser.iloc [3],因此你得到3.

它根本不直观,但它是什么!

argsort返回一个与初始系列具有相同索引的系列(因此您可以使用.iloc),但将值替换为排序值的先前位置。

答案 1 :(得分:1)

不,这不是argsort的工作方式。 argsort告诉您该元素在原始列表中的来源。如果查看argsort ed索引,您会看到第一个元素属于原始系列中的索引5。如果你看第5个索引,你会看到5,这确实是最小的值。等等。