如何获取值不能被 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.050049mask 的值是False,这表明那些 0049 数字只是数字 1709.05 的浮点表示问题,当我使用 [= 从我的原始数据创建 s 时,它是这样提取的20=] 方法。因此,我想知道我屏蔽0.01mask = (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