Python 如何获取值不可被0.01分割的行-浮点运算的潜在问题
我有一个带有浮点值的熊猫系列,如下所示:Python 如何获取值不可被0.01分割的行-浮点运算的潜在问题,python,pandas,floating-point,precision,Python,Pandas,Floating Point,Precision,我有一个带有浮点值的熊猫系列,如下所示: s = pd.Series({0: 899.0, 1: 899.0, 2: 1099.0, 3: 279.29998779296875, 4: 2598.833251953125, 5: 499.1666564941406, 6: 1709.050048828125, 7: 279.29998779296875, 8: 999.0, 9: 1498.9949951171875}, name="var"
s = pd.Series({0: 899.0,
1: 899.0,
2: 1099.0,
3: 279.29998779296875,
4: 2598.833251953125,
5: 499.1666564941406,
6: 1709.050048828125,
7: 279.29998779296875,
8: 999.0,
9: 1498.9949951171875}, name="var")
我希望得到所有值的索引,这些值不可被0.01分割,因此我尝试定义mask=(100*s%1)>0
,这在提供的示例系列中非常有效:
s[mask]
3 279.299988
4 2598.833252
5 499.166656
6 1709.050049
7 279.299988
9 1498.994995
Name: var, dtype: float64
s[~mask]
0 899.0
1 899.0
2 1099.0
8 999.0
Name: var, dtype: float64
然而,这里提供的
s
只是一个更大数据集的样本,当我在原始系列上做同样的操作时,1709.050049
的mask
的值是False
,这表明那些0049
数字只是数字1709.05
的浮点表示问题,当我使用pd.Series.to_dict()
方法从原始数据中创建s
时,它被提取出来。因此,我想知道我用0.01
(mask=(100*s%1)>0
)来屏蔽不可分的数字的方法是否正确。如果不是,该解决方案出了什么问题,我们如何正确屏蔽这些值?您可以通过设置rtol
参数来实现您想要的:
s = pd.Series({
0: 898.999998,
1: 899.0,
2: 1099.0,
3: 279.29998779296875,
4: 2598.833251953125,
5: 499.1666564941406,
6: 1709.050048828125,
7: 279.29998779296875,
8: 999.0,
9: 1498.9949951171875,
10: 326.78}
, name="var")
tolerance = 1e-12
mask = np.isclose(s, s.round(2),rtol = tolerance)
s[mask]
1 899.00
2 1099.00
8 999.00
10 326.78
Name: var, dtype: float64
这看起来像是一种复杂的方式来避免一个应该以不同方式解决的问题。。。你的最终目标是什么?你能解释一下“0.01不可分”是什么意思吗?@Thierrylahuille得到0.01不可分的数字实际上是我的最终目标。这些数字代表价格,任何不是多重数
0.01
的价格在某种程度上都是可疑的,可能是应用了折扣或类似的东西。@SergeyBushmanov不可分割表示它不能被0.01
除,也就是说,它不是0.01
的多重数,困难在于0.01的数量不能用浮点精确表示,因为它不是2的幂的倍数。尝试乘以100并将结果转换为十进制。十进制。这是一个非常好的想法(+1),谢谢!然而,正如我之前的一条评论,当我用326.78
乘以100
时,我得到32677.99999996
,模运算符返回0.99999999996362
,它接近1
,而不是0
。