如何在 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) )
我正在尝试求解方程组:
我想在 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) )