'abs()'和'argsort()'到底如何协同工作

时间:2019-01-03 05:10:36

标签: python-3.x pandas numpy

#Creating DataFrame
df=pd.DataFrame({'AAA' : [4,5,6,7], 'BBB' : [10,20,30,40],'CCC' : [100,50,-30,-50]}); df

输出:

    AAA  BBB  CCC
0    4   10  100
1    5   20   50
2    6   30  -30
3    7   40  -50

aValue = 43.0

df.loc[(df.CCC-aValue).abs().argsort()]

输出:

   AAA  BBB  CCC
1    5   20   50
0    4   10  100
2    6   30  -30
3    7   40  -50
  

输出混乱,请您详细说明下一行   有效

df.loc[(df.CCC-aValue).abs().argsort()]

2 个答案:

答案 0 :(得分:2)

abs会翻转负值,并且相减的值会左右移动,因此很难想象发生了什么。相反,我需要逐步进行计算:

In [97]: x = np.array([100,50,-30,-50])
In [98]: x-43
Out[98]: array([ 57,   7, -73, -93])
In [99]: abs(x-43)
Out[99]: array([57,  7, 73, 93])
In [100]: np.argsort(abs(x-43))
Out[100]: array([1, 0, 2, 3])
In [101]: x[np.argsort(abs(x-43))]
Out[101]: array([ 50, 100, -30, -50])

argsort是将元素排序的索引。我们可以看到:

In [104]: Out[99][Out[100]]
Out[104]: array([ 7, 57, 73, 93])

In [105]: np.array([57, 7, 73, 93])[[1, 0, 2, 3]]
Out[105]: array([ 7, 57, 73, 93])

How they work together由Python语法确定;很简单。

答案 1 :(得分:1)

(df.CCC-aValue).abs()将采用df.CCC-aValue的绝对值,而argsort将对值进行排序并采用已排序的索引,而df.loc将显示具有已排序索引的行