Pandas:浮点数的差异

4

我是一名有用的助手,可以为您进行翻译。

我遇到了一个奇怪的问题。我有一个数据框 df,格式如下:

In [1561]: df
Out[1561]: 
      A     B
0  16.3  1.10
1  23.2  1.33
2  10.7 -0.43
3   5.7 -2.01
4   5.4 -1.86
5  23.5  3.14

我正在比较列 A 中相邻的每两行,并将它们的差异存储在一个新列中:

In [1562]: df['new_diff'] = (df.A - df.A.shift(-1)).fillna(0)
In [1563]: df
Out[1563]: 
      A     B  new_diff
0  16.3  1.10      -6.9
1  23.2  1.33      12.5
2  10.7 -0.43       5.0
3   5.7 -2.01       0.3
4   5.4 -1.86     -18.1
5  23.5  3.14       0.0

当我检查 new_diff 等于 5.0 的行时,得到一个空的数据框。但是,当我检查 < 5.0 或者 > 5.0 时,它可以正常工作。请看下面的示例:
In [1567]: df[df['new_diff'] == 5.0]
Out[1567]: 
Empty DataFrame
Columns: [A, B, new_diff]
Index: []

In [1568]: df[df['new_diff'] > 5.0]
Out[1568]: 
      A     B  new_diff 
1  23.2  1.33      12.5  

In [1569]: df[df['new_diff'] < 5.0]
Out[1569]: 
      A     B  new_diff
0  16.3  1.10      -6.9
2  10.7 -0.43       5.0
3   5.7 -2.01       0.3
4   5.4 -1.86     -18.1
5  23.5  3.14       0.0

请告诉我这里我漏掉了什么?
3个回答

5

问题出在浮点数精度上,需要使用numpy.isclose函数:

print (df['new_diff'].tolist())
[-6.899999999999999, 12.5, 4.999999999999999, 0.2999999999999998, -18.1, 0.0]

print (df[np.isclose(df['new_diff'], 5)])
      A     B  new_diff
2  10.7 -0.43       5.0

浮点精度应该是多少才能使它像这样工作 df[df['new_diff'] == 5.0] - Mayank Porwal
@MayankPorwal - 是的,float类型是这样工作的。我认为主要问题在于pandas会将显示值四舍五入,所以看到5实际上是4.999999999999999,这会带来问题。 - jezrael
1
好的。Pandas 的四舍五入导致了这个问题。 - Mayank Porwal

1
只需调用round,即
df[df['new_diff'].round() == 5.0]

      A     B  new_diff
2  10.7 -0.43       5.0

1

或者,在过滤过程中将字符串类型设置为'new_diff'(不修改实际数据),然后检查它是否等于'5.0'

print(df[df['new_diff'].astype(str)=='5.0'])

输出:

      A     B  new_diff
2  10.7 -0.43       5.0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接