Python熊猫:使用.values属性对系列进行子集设置时的问题

问题描述

我在使用Pandas Series时遇到问题:我创建了一个包含一些值的数组。为了测试目的,我试图确保在Series中存在某些值,所以我将其子集设置如下:

A = np.arange(start=-10,stop=10,step=0.1)
Aseries = pd.Series(A) 
Aseries[Aseries.values == 9]

,这返回了一个空数组。但是我只需要将步长(从0.1更改为1),然后就可以使用...我已经仔细检查了Series确实包含了我要查找的值(两个步长值...)

这是我更改步骤的代码(以输出作为证明)

#Generating an array conaining 200 values from -10 to 10 with a step of 0.1
A = np.arange(start=-10,step=0.1)
Aseries = pd.Series(A)
Aseries[Aseries.values == 9]

#Generating an array conaining 20 values from -10 to 10 with a step of 0.1
B = np.arange(start=-10,step=1)
Bseries = pd.Series(B)

print("'Aseries' having the value 9:")
print(Aseries[Aseries.values == 9])
print("'Bseries' having the value 9:")
print(Bseries[Bseries.values == 9])

输出

'Aseries' having the value 9:
Series([],dtype: float64)
'Bseries' having the value 9:
19    9
dtype: int32

对这里发生的事情有任何想法吗?预先感谢!

[EDIT]:由于某种原因,我无法在此线程中添加任何其他帖子,因此,我将添加在这里找到的解决方案: 就像@Quang Hoang和@Kim Rop所解释的那样,非整数步长值不会真正返回其预期值。所以之后:

Aseries = pd.Series(A) 

我只是添加一个舍入指令,以使数组中的值仅保留小数点后一位,并且对子集操作进行了如下修改

Aseries[(Aseries.values < 9.1) &(Aseries.values < 9.1)]

我不再遇到这个问题了……感谢@Quang Hoang和@Kim Rop

解决方法

根据offical document

使用非整数步骤(例如0.1)时,结果通常不会 始终如一。在这种情况下,最好使用numpy.linspace。

部分原因是浮点精度。