首页 > 解决方案 > 'abs()' 和 'argsort()' 究竟是如何一起工作的

问题描述

#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()]

标签: python-3.xpandasnumpy

解决方案


通过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 语法决定;这是直截了当的。


推荐阅读