首页 > 解决方案 > Python pandas:使用 .values 属性对 Series 进行子集时的问题

问题描述

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

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, stop=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, stop=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

知道这里发生了什么吗?提前致谢!

[编辑]:由于某种原因,我无法在此线程中添加任何其他帖子,所以我将添加我在这里找到的解决方案:就像 @Quang Hoang 和 @Kim Rop 由非整数步长值解释的,它并没有真正返回什么它应该。所以之后:

Aseries = pd.Series(A) 

我只是添加了一个舍入指令,只在数组中的值之后保留一位小数,并用类似的东西调整了我的子集操作:

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

我不再有这个问题了......谢谢@Quang Hoang 和@Kim Rop

标签: pythonpandasseries

解决方案


根据官方文件

当使用非整数步长(例如 0.1)时,结果通常会不一致。对于这些情况,最好使用 numpy.linspace。

这也部分是因为浮点精度。


推荐阅读