pandas的^{
df = pd.DataFrame([[1.2, 0.3, 1.5, 1.4, 1.7, 4.2]])
print(df)
0 1 2 3 4 5
0 1.2 0.3 1.5 1.4 1.7 4.2
print(df.dtypes)
0 float64
1 float64
2 float64
3 float64
4 float64
5 float64
dtype: object
# everything works as expected until here
print(df.isin([1.2, 1.4]))
0 1 2 3 4 5
0 True False False True False False
但是,当数据类型被强制转换为float32
时,isin开始失败:
这里有一个类似的post关于SO。在
我理解浮点的复杂性。但是,从用户的角度来看,如果用户希望使用isin
作为col1 == 1 | col1 == 3 | col1 == 5
的便利函数(只写col1.isin([1, 3, 5])
),那么当数据类型不同时,它可能会导致无法识别的错误,并且不会对数据类型偏差发出警告。在
此外,isin
返回的结果与df.eq
不同:
print(df.isin([1.2]))
0 1 2 3 4 5
0 False False False False False False
print(df.eq(1.2))
0 1 2 3 4 5
0 True False False False False False
这绝对是一种不受欢迎的行为。正如JohnE所指出的,df.eq
似乎使用了np.isclose公司而df.isin
没有。在
也许这会让事情变得更清楚:
一般来说,你不希望看到18位小数,这样熊猫们就可以合理地选择显示多少位小数,但差别仍然存在,尽管看不见。因此,您需要确保将float64与float64以及float32与float32进行比较。这就是我们为自己选择的浮点生活。。。在
或者,如果一次只比较一个值,则可以使用
^{pr2}$np.isclose
(在import numpy as np
之后)来确定近似相等:(当然,您不需要
astype()
,这只是为了证明float32和float64都会得到相同的答案。)我不知道是否有一种方法可以使
isin
以可比的方式工作,因此您可能需要做一些类似的事情:相关问题 更多 >
编程相关推荐