如何在 pandas 数据框列上应用 fsolve?

how to apply fsolve over pandas dataframe columns?

我正在尝试求解方程组:

我想在 pandas 数据帧上应用 fsolve。

我该怎么做?

这是我的代码:

import numpy as np
import pandas as pd
import scipy.optimize as opt
a = np.linspace(300,400,30) 
b = np.random.randint(700,18000,30) 
c = np.random.uniform(1.4,4.0,30) 
df = pd.DataFrame({'A':a, 'B':b, 'C':c})


def func(zGuess,*Params):
    x,y,z = zGuess
    a,b,c = Params
    
    eq_1 = ((3.47-np.log10(y))**2+(np.log10(c)+1.22)**2)**0.5
    eq_2 = (a/101.32) * (101.32/b)** z
    eq_3 = 0.381 * x + 0.05 * (b/101.32) -0.15
    return eq_1,eq_2,eq_3


zGuess = np.array([2.6,20.2,0.92])

df['result']= df.apply(lambda x: opt.fsolve(func,zGuess,args=(x['A'],x['B'],x['C'])))

但是还是不行,我也看不出问题所在

错误:KeyError: 'A' 基本上意味着他找不到对 'A' 的引用 发生这种情况是因为 apply 不会默认应用于行。

通过在末尾设置参数 1,它将迭代每一行,查找列引用 'A'、'B'、...

df['result']= df.apply(lambda x: opt.fsolve(func,zGuess,args=(x['A'],x['B'],x['C'])),1)

但是,这可能不会给出所需的结果,因为它将所有输出(一个数组)保存到一个列中。

为此,参考您要创建的三列,使用 zip(*...) 创建一个交互器

df['output_a'],df['output_b'],df['output_c'] = zip(*df.apply(lambda x: opt.fsolve(func,zGuess,args=(x['A'],x['B'],x['C'])),1) )