循环 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.])]
我有一个来自 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.])]