python - 选择特定值时数据框未正确过滤(熊猫)
问题描述
我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
。
解决方案
问题在于浮点比较,它不仅限于 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
推荐阅读
- linux - Git 每天自动提交
- iframe - 从 iframe 页面在父页面中设置隐藏字段值
- cobol - 比较字段时 SOC7 异常
- c - 从C中的文件中读取矩阵
- javascript - React bootstrap onclick list-group-item 突出显示项目/活动
- c# - 如何使用 v6.2 读取脚本字段距离?
- python - python3中使用随机库交换list的元素
- java - 如何在JAVA中修剪StringBuffer中的空白
- ios - 无法将新行插入具有动态部分和行数的 UITableView
- javascript - Loopback - 远程方法和展平相关模型查询结果