使用Pandas匹配CSV中drug1与drug2时遇ValueError的解决方法
解决Pandas多条件筛选的模糊真值错误
问题背景
现有CSV数据结构如下(分隔符为|):
drug1 |drug2 |chem |enzym |indication |offside |pathway|sideeffect|target|transporter DB00945 |DB00526|0.217391304|0 |0 |0.139664804|0 |0.470588235|0 |0
需求是通过Pandas查询指定drug1与userDrugs列表中每个drug2的组合,提取特征字段后用模型预测结果。原代码运行时触发ValueError: The truth value of a Series is ambiguous错误。
错误原因
- 逻辑运算符误用:Python原生
and要求单个布尔值,而Pandas中df['drug1']==drugName返回的是布尔Series,需用Pandas支持的按位与运算符&,且每个条件需加括号保证运算优先级。 - CSV分隔符错误:原代码用
sep=",",但实际数据分隔符是|,会导致读取后列名和数据混乱。 - 多列选取语法错误:选取多列需用双层方括号
[['列名1', ...]],单层方括号会触发KeyError。
修复后的完整代码
import pandas as pd def getData(drugName, userDrugs): # 修正分隔符为|,并去除单元格前后空格 data = pd.read_csv(r"C:\Users\soso-\Desktop\python & flutter\drug data.csv", sep="|", skipinitialspace=True) df = pd.DataFrame(data) # 提前定义特征列列表,避免重复书写 feature_cols = ['chem','enzym','indication','offside','pathway','sideeffect','target','transporter'] for drug2 in userDrugs: # 用&替代and,给每个条件加括号 mask = (df['drug1'] == drugName) & (df['drug2'] == drug2) similarities = df.loc[mask, feature_cols] # 检查是否匹配到数据,避免模型预测空值报错 if not similarities.empty: # 将数据转换为模型要求的格式(比如二维数组) result = loaded_model.predict(similarities.values) print(f"组合 {drugName} & {drug2} 的预测结果: {result}") else: print(f"未找到 {drugName} & {drug2} 的匹配数据") # 调用示例 getData('DB00945', ['DB00454','DB00952'])
关键修改点说明
- CSV读取优化:
sep="|"匹配实际分隔符,skipinitialspace=True自动去除单元格前后的空格(比如DB00945 |中的空格)。 - 条件筛选修正:用
&连接布尔条件,每个条件加括号确保逻辑正确。 - 数据安全判断:增加
similarities.empty检查,避免模型传入空数据导致报错。 - 代码可读性优化:提前定义特征列列表,循环变量名改为
drug2更直观。
内容的提问来源于stack exchange,提问作者Sara Almashharawi
相关产品推荐
相关产品推荐

