You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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错误。

错误原因

  1. 逻辑运算符误用:Python原生and要求单个布尔值,而Pandas中df['drug1']==drugName返回的是布尔Series,需用Pandas支持的按位与运算符&,且每个条件需加括号保证运算优先级。
  2. CSV分隔符错误:原代码用sep=",",但实际数据分隔符是|,会导致读取后列名和数据混乱。
  3. 多列选取语法错误:选取多列需用双层方括号[['列名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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 10:26:02