如何获取值不能被 0.01 整除的行 - 浮点运算的潜在问题
How to get rows where a value is indivisible by 0.01 - potential issues with floating point arithmetic
我有一个带有浮点值的 pandas 系列,如下所示:
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
的浮点表示问题,当我使用 [= 从我的原始数据创建 s
时,它是这样提取的20=] 方法。因此,我想知道我屏蔽0.01
(mask = (100 * s % 1) > 0
)不可整除数字的方法是否正确。如果不是,该解决方案出了什么问题,我们如何才能正确屏蔽这些值?
您可以通过 np.isclose 实现您想要的效果,方法是设置 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
我有一个带有浮点值的 pandas 系列,如下所示:
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
的浮点表示问题,当我使用 [= 从我的原始数据创建 s
时,它是这样提取的20=] 方法。因此,我想知道我屏蔽0.01
(mask = (100 * s % 1) > 0
)不可整除数字的方法是否正确。如果不是,该解决方案出了什么问题,我们如何才能正确屏蔽这些值?
您可以通过 np.isclose 实现您想要的效果,方法是设置 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