pandas isin()作为eq()浮动数据类型依赖项issu返回不同的结果

2024-04-25 01:01:25 发布

您现在位置:Python中文网/ 问答频道 /正文

pandas的^{}方法似乎有一个dtype依赖关系(使用python3.5和pandas 0.19.2)。我只是偶然在一个相关的topic中遇到了这个问题,我们无法解释isin的非工作行为。示例如下:

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开始失败:

^{pr2}$

这里有一个类似的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没有。在


Tags: 方法用户falsetruepandasdftopic关系
2条回答
#try this:
import numpy as np
df = df.apply(lambda x: x.astype(np.float32))
test=[1.2,1.4]
test=test.apply(lambda x: x.astype(np.float32))
df.isin(test)

也许这会让事情变得更清楚:

>>> '%20.18f' % df[0].astype(np.float64)
'1.199999999999999956'

>>> '%20.18f' % df[0].astype(np.float32)
'1.200000047683715820'

一般来说,你不希望看到18位小数,这样熊猫们就可以合理地选择显示多少位小数,但差别仍然存在,尽管看不见。因此,您需要确保将float64与float64以及float32与float32进行比较。这就是我们为自己选择的浮点生活。。。在

或者,如果一次只比较一个值,则可以使用np.isclose(在import numpy as np之后)来确定近似相等:

^{pr2}$

(当然,您不需要astype(),这只是为了证明float32和float64都会得到相同的答案。)

我不知道是否有一种方法可以使isin以可比的方式工作,因此您可能需要做一些类似的事情:

>>> np.isclose( df, 1.2 ) | np.isclose( df, 1.4 )
array([[ True, False, False,  True, False, False]], dtype=bool)

相关问题 更多 >