You need to enable JavaScript to run this app. Pandas按模型类型多条件计算时eval报参数数量错误如何解决?
优惠活动
大模型
产品
解决方案
定价
更多

Pandas按模型类型多条件计算时eval报参数数量错误如何解决?

错误原因
  • 语法错误:c1 = df['Model_form']]、c2 = df['Model_form']]、c3 = df['Model_form']] 三处都多写了一个右中括号],会先触发语法报错。
  • 核心报错原因:你错误调用了df.eval()方法,pd.DataFrame.eval()的第一个入参要求是字符串形式的计算表达式,且最多只接受3个位置参数。你原来的代码把三个计算表达式全部放在df.eval()的括号内部作为入参,相当于给df.eval()传了3个位置参数,加上方法自带的self参数,总共4个,超过了参数数量限制,因此触发报错。且此处你完全不需要嵌套使用df.eval()。
  • 补充问题:你给出的log公式里标注的是Ln(1+C*optimal),但代码里用的是df['Actual'],下面的实现默认你是笔误,统一使用Actual列计算。

正确实现代码

首先导入依赖库:

import pandas as pd
import numpy as np
import re

示例DataFrame构造(可直接运行测试):

df = pd.DataFrame({
    'ID': [1,2,3],
    'Model_form': ['Exp', 'Power model', 'Log'],
    'A': [2, 1, 0.6],
    'C': [1.4, 0.2, 6],
    'Actual': [4,3,7]
})

核心计算逻辑:

# 构造匹配条件,去掉多余的右括号
c1 = df['Model_form'].str.contains('exp', flags=re.IGNORECASE)
c2 = df['Model_form'].str.contains('pow', flags=re.IGNORECASE)
c3 = df['Model_form'].str.contains('log', flags=re.IGNORECASE)

# 直接把各条件对应的计算结果序列传入np.select即可
df['Actual(y)'] = np.select(
    [c1, c2, c3],
    [
        df['A'] * (1 - np.exp(df['C'] * df['Actual'])),
        df['A'] * (df['Actual'] ** df['C']),
        df['A'] * np.log(1 + df['C'] * df['Actual'])
    ]
)

如果你想使用df.eval()简化写法,可以把表达式写成字符串传入:

# 基于df.eval的简化写法
df['Actual(y)'] = np.select(
    [c1,c2,c3],
    [
        df.eval("A * (1 - exp(C * Actual))"),
        df.eval("A * (Actual ** C)"),
        df.eval("A * log(1 + C * Actual)")
    ]
)

运行后得到的计算结果参考:

IDModel_formACActualActual(y)
1Exp21.44-5029.6489
2Power model10.231.2457
3Log0.6672.2721

内容的提问来源于stack exchange,提问作者tj judge

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.17 06:15:07