pandas DataFrame列值比较触发TypeError及字符串过滤问题咨询
问题根因
- 你写的
type(data.CAPEX) != str不生效的原因:data.CAPEX是Pandas Series对象,type()返回的是Series类本身,而非单个元素的类型,因此该判断永远为真,没有过滤效果。 - 过滤
CAPEX != 'Pending'后仍然报错的原因:CAPEX列还存在除'Pending'以外的其他字符串值,或是过滤后列的dtype仍为object,部分隐式字符串类型的数值未被识别,触发了字符串和整数的比较错误。
解决方法
有两种常用方案,推荐使用第二种容错性更高的方案:
方案1:先过滤所有字符串类型值再筛选
# 先过滤掉CAPEX列为字符串类型的所有行 data = data[data['CAPEX'].apply(lambda x: not isinstance(x, str))] # 将CAPEX列转为数值类型,避免后续比较报错 data['CAPEX'] = pd.to_numeric(data['CAPEX']) # 筛选500到1500区间的数据 data = data[(data['CAPEX'] >= 500) & (data['CAPEX'] <= 1500)]
方案2:利用数值转换自动剔除所有非数值行
该方案不需要提前枚举所有要过滤的字符串值,所有无法转为数值的内容都会被自动标记为空值后删除:
# 将CAPEX列转为数值类型,非数值内容转为空值NaN data['CAPEX'] = pd.to_numeric(data['CAPEX'], errors='coerce') # 删除CAPEX列为空的行(即原来的非数值行) data = data.dropna(subset=['CAPEX']) # 直接用between方法筛选区间,等价于>=500且<=1500 data = data[data['CAPEX'].between(500, 1500)]
内容的提问来源于stack exchange,提问作者fgbh1997
相关产品推荐
相关产品推荐

