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)") ] )
运行后得到的计算结果参考:
| ID | Model_form | A | C | Actual | Actual(y) |
|---|---|---|---|---|---|
| 1 | Exp | 2 | 1.4 | 4 | -5029.6489 |
| 2 | Power model | 1 | 0.2 | 3 | 1.2457 |
| 3 | Log | 0.6 | 6 | 7 | 2.2721 |
内容的提问来源于stack exchange,提问作者tj judge
相关产品推荐
相关产品推荐

