如何修复DataFrame双条件判断中的TypeError并规避浮点类型错误
问题描述
现有如下包含Datetime、kt、CMF列的DataFrame:
Datetime kt CMF 2022-06-09 12:33:00 0.4164263068002197 0.8847680578178683 2022-06-09 12:34:00 0.42792520202792106 0.8725120368719221 2022-06-09 12:35:00 0.5134482518105007 0.8602633894204332 2022-06-09 12:36:00 0.5306221108293145 0.8480020389466362 2022-06-09 12:37:00 0.576460973390728 0.8357518604940146 2022-06-09 12:38:00 0.5787411028480746 0.823494817828331 2022-06-09 12:39:00 0.5941322373815262 0.8112418608843985
需要添加新列sun disk,规则为:当CMF>=0.8且kt>=0.6时标记为non blocked disk,否则标记为blocked disk。
尝试执行以下代码时触发错误:
frames['sun disk'] = np.where((frames['CMF'] >= 0.8 & frames['clearness index (kt)'] >= 0.6 ) , "non blocked" , 'blocked')
错误信息:
TypeError: Cannot perform 'rand_' with a dtyped [float64] array and scalar of type [bool]
修复方案
1. 修复逻辑运算符优先级与列名错误
错误的核心原因是位运算&的优先级高于比较运算符>=,导致代码先执行0.8 & frames['clearness index (kt)'],将浮点数与布尔数组做位运算,触发类型错误。同时代码中列名clearness index (kt)与实际DataFrame中的kt不符,会导致列不存在问题。
修正后的基础代码:
import numpy as np frames['sun disk'] = np.where( (frames['CMF'] >= 0.8) & (frames['kt'] >= 0.6), "non blocked disk", "blocked disk" )
- 给每个比较条件单独加括号,确保先执行比较运算得到布尔数组,再执行逻辑与运算
& - 修正列名为实际存在的
kt - 统一标记文本为需求中的
non blocked disk和blocked disk
2. 规避浮点精度问题
由于浮点数存在存储精度误差(比如0.8可能被存储为0.7999999999999999),直接用>=比较可能出现不符合预期的结果,可通过以下两种方式解决:
方式一:使用近似相等判断
借助pandas的isclose函数,允许一定误差范围:
# 构造条件:CMF接近或大于0.8,且kt接近或大于0.6 cmf_condition = pd.isclose(frames['CMF'], 0.8, atol=1e-9) | (frames['CMF'] > 0.8) kt_condition = pd.isclose(frames['kt'], 0.6, atol=1e-9) | (frames['kt'] > 0.6) frames['sun disk'] = np.where(cmf_condition & kt_condition, "non blocked disk", "blocked disk")
方式二:四舍五入后比较
如果业务允许,先对浮点数列保留固定小数位再比较:
condition = (frames['CMF'].round(6) >= 0.8) & (frames['kt'].round(6) >= 0.6) frames['sun disk'] = np.where(condition, "non blocked disk", "blocked disk")
验证结果
根据示例数据,所有行的kt值均小于0.6,因此新列sun disk的所有值都会是blocked disk。
内容的提问来源于stack exchange,提问作者span_path
相关产品推荐
相关产品推荐

