循环 pandas 数据框,以便在 python 中用 fsolve 求解方程

Loop over pandas data frame in order to solve equation with fsolve in python

我有一个来自 csv 输入文件的数据框作为数据框。我想遍历数据框中的每一行并为每一列分配一个变量。然后将这些变量包含在一个方程式中,我想最终通过包含数据框每一行的值来解决这个问题。最后,我想要一个已解决的输出,其中数据框中的每一行都有 4 个值。

df = pd.read_csv('path/testfile.csv', delimiter='\t', header=None)
print(df)

           0         1         2         3         4         5
0   0.227996  0.337029  0.238164  0.183009  0.085747  0.134129
1   0.247891  0.335556  0.272129  0.187329  0.085921  0.128372
2   0.264761  0.337778  0.245918  0.183212  0.080493  0.122786
3   0.305061  0.337778  0.204265  0.208453  0.071558  0.083683
4   0.222749  0.337029  0.209715  0.084253  0.142014  0.234673
5   0.190816  0.337029  0.291872  0.041575  0.463764  0.053193
6   0.299625  0.337029  0.206064  0.200905  0.072955  0.092528
7   0.259740  0.340045  0.202792  0.156021  0.087506  0.148796

我有一些变量:

for index, row in df.iterrows():
    K=df[0]
    L=df[1]
    M=df[2]
    N=df[3]
    P=df[4]
    F=df[5]
    H=1-K
    def f2(z):
      a=z[0]
      b=z[1]
      c=z[2]
      d=z[3]
      f=np.zeros(4)
      f[0]=K*a*((1-c)*L+(b-d)*M)-N
      f[1] =P+a*c*d*b
      f[2]= F+H*c*a*d+b
      f[3]= H+F+P*a*b*c*d
      return f
    z= fsolve(f2,[1,1,1,1])

print(z)

但我无法 link 将 for 循环添加到等式中以输入数据框的每一行。最后它只给了我 4 个值。而不是每行 4 个值。

有人知道怎么做吗?

这里有一个方法,我使用你原来问题的符号约定。我稍微重写了你的功能,但操作相同。然后为了效率,我不使用iterrows,而是将所有数据解包并使用一个简单的for循环。最后,res是一个数组列表,每个元素是每一行的已解决答案。

# rewrite your function
def f2_bis(z, Ai, Bi, Ci, Di, Ei, Fi, Hi):
    a, b, c, d = z
    return np.array([
        Ai*a*((1-c)*Bi+(b-d)*Ci)-Di,
        Ei+a*c*d*b,
        Fi+Hi*c*a*d+b,
        Hi+Fi+Ei*a*b*c*d
    ])

# unpack the value of each column in different variable
A, B, C ,D, E, F = df.to_numpy().T
H = 1-A

# get the result for each "row"
res = [
    fsolve(f2_bis, [1,1,1,1], args=(Ai, Bi, Ci, Di, Ei, Fi, Hi))
    for Ai, Bi, Ci, Di, Ei, Fi, Hi in zip(A, B, C, D, E, F, H)
]
res
# [array([ 1.25482583, -0.32608114, -0.17861197, -0.98296457]),
#  array([ 0.70750447, -0.41512857, -0.30218114, -1.80533338]),
#  array([-2.91283478, -0.41076736,  1.41022472, -0.09615889]),
#  array([ 2.87736785,  0.25256582,  0.6107988 , -0.26507222]),
#  array([-0.532438  ,  0.34016552,  6.64918304,  0.18908195]),
#  array([ 1.1062844 ,  0.73110855, -0.65958519,  1.32070547]),
#  array([1., 1., 1., 1.]),
#  array([1., 1., 1., 1.])]