首页 > 解决方案 > 选择特定值时数据框未正确过滤(熊猫)

问题描述

df看起来像这样:

col1 col2 col3 临时编号
100279 24.0 75.8 0.1 99.9
100055 52.2 47.8 0.0 100.0
107782 12.3 86.2 1.5 100.0
112956 12.3 86.2 1.5 100.0
139957 19.9 79.9 0.2 100.0

TEMPPNUM列是这样创建的:

df['TEMPPNUM'] = ((df['col1'] + df['col2'] + df['col3']))

我想过滤掉TEMPPNUM列不等于 100 的所有行。

df = df.loc[(df['TEMPPNUM'] == 100)]

但是,当我这样做时,过滤掉的值比我预期的要多。有什么原因吗?(我的数据框比示例大得多)。

它会过滤掉所有不等于 100 的值,但也会过滤掉不少等于 100 的行TEMPPNUM

标签: pythonpandasdataframefilter

解决方案


问题在于浮点比较,它不仅限于 Pandas DataFrame。这是 Python(可能还有其他语言)中的一个普遍问题,很难直接比较它们。这解释了为什么在使用整数时问题更少。

您在屏幕上看到的精度(“100.0”)不是它的存储方式,而是更细粒度的。由于舍入和精度,显然并不总是相同。

例如/解决方案请参阅相关问题,例如比较熊猫列中的浮点数

解决方案通常是比较它们是否在彼此之间的某个小距离内,而不是实际上相等,例如通过 numpy:

>>> import numpy as np    
>>> np.isclose(df['TEMPNUM'], 100.0)
    array([False,  True,  True,  True,  True])
>>> df[np.isclose(df['TEMPNUM'], 100.0)]
      URN  col1  col2  col3  TEMPNUM
1  100055  52.2  47.8   0.0    100.0
2  107782  12.3  86.2   1.5    100.0
3  112956  12.3  86.2   1.5    100.0
4  139957  19.9  79.9   0.2    100.0

推荐阅读