DataFrame循环If/else语句报错:字符串与浮点数无法比较
解决TypeError并优化孔隙度计算代码
错误原因分析
你遇到的TypeError: '<' not supported between instances of 'str' and 'float'核心问题是**VSH列的数据类型是字符串(str)**,而你试图把它和浮点数(0.2/0.7)做大小比较——Python不支持字符串与数值类型直接进行这类比较,所以抛出了错误。
另外你的for循环还存在一个隐藏bug:data.loc[index,'porosity']=(data['density']*2.3)这行代码是把整个density列乘以2.3的结果赋值给当前行的porosity,而不是用当前行的density值计算,这会导致数据错误。
分步解决方案
1. 转换VSH列为数值类型
首先需要把VSH列从字符串转换成可计算的数值类型,同时处理可能存在的非数值异常值:
import pandas as pd # 将VSH列转换为数值类型,无法转换的值会被设为NaN data['VSH'] = pd.to_numeric(data['VSH'], errors='coerce')
2. 用向量化操作替代低效的for循环
Pandas的iterrows()逐行迭代效率极低(尤其大数据量时),推荐用向量化操作批量处理,既高效又简洁:
方法一:使用np.where嵌套赋值
import numpy as np # 初始化porosity列为NaN(对应VSH在0.2~0.7之间的未定义情况) data['porosity'] = np.nan # 先处理VSH < 0.2的情况 data['porosity'] = np.where(data['VSH'] < 0.2, data['density'] * 2.3, data['porosity']) # 再处理VSH > 0.7的情况 data['porosity'] = np.where(data['VSH'] > 0.7, data['density'] * 1.7, data['porosity'])
方法二:使用loc批量赋值(更直观)
# 初始化porosity列为NaN data['porosity'] = np.nan # 给VSH < 0.2的行赋值 data.loc[data['VSH'] < 0.2, 'porosity'] = data['density'] * 2.3 # 给VSH > 0.7的行赋值 data.loc[data['VSH'] > 0.7, 'porosity'] = data['density'] * 1.7
验证示例数据
用你提供的示例数据测试,第一行depth=5517的VSH=0.8347>0.7,计算得到的porosity=2.126*1.7=3.6142,完全符合需求。
内容的提问来源于stack exchange,提问作者akkab
相关产品推荐
相关产品推荐

