在多行上执行功能

时间:2019-04-28 18:56:58

标签: python python-3.x pandas dataframe optimization

我已经定义了一个函数。这称为“对分”,其代码在帖子下方。

我还有一个名为“ v”的数据框,其中包含7列2行:


 $.ajax(
    {
        url: "/comment/delete/"+id,
        type: 'POST',
        dataType: "JSON",
        data: {
            "id": id,
            "_method": 'DELETE',
            "_token": token,
        },
        success: function ()
        {
            console.log("it Work");
        }
    });
    console.log("It failed");
});

您在平分函数中看到我需要四个参数。 f,a,b和N。 这些定义如下:

D   P   h     O   Q   SD      LT
80  27  0.37 50   2    3      1.51
50  27  0.25 50   2    3      0.03

现在,“ f”是一个带有未知变量的函数:“ x”。这是一个匿名函数(lambda x)。二等分函数找到值“ x”,其中f等于零。现在,'f'是一个非常讨厌的派生,是的,我将对其进行清理,但是请不要专注于此,因为函数本身是正确的。因此,“ f”是:

b = 5
a = 0.05
N = 1000

目标是将'bisection-function'应用于数据帧中的每一行:从而添加一个新列,该每一列将给出bisection-function的结果,其中该函数使用所有7列。

现在,当我想应用功能'bisection(f,a,b,N)'时,我尝试了以下代码:

f = lambda x: norm.ppf(1-(v.iloc[i,4]*v.iloc[i,1]*v.iloc[i,2])/(2*v.iloc[i,0]*x))*v.iloc[i,5]*np.sqrt(v.iloc[i,6])*v.iloc[i,1]*v.iloc[i,2]+np.sqrt(2*v.iloc[i,0]*v.iloc[i,3]*v.iloc[i,1]*v.iloc[i,2])-v.iloc[i,0]*x*(((-(norm.ppf(1-(v.iloc[i,4]*v.iloc[i,2]*v.iloc[i,1])/(2*x*v.iloc[i,0]))))*(1-norm.cdf((norm.ppf(1-(v.iloc[i,4]*v.iloc[i,2]*v.iloc[i,1])/(2*x*v.iloc[i,0]))),loc=0,scale=1))+(norm.pdf((norm.ppf(1-(v.iloc[i,4]*v.iloc[i,2]*v.iloc[i,1])/(2*x*v.iloc[i,0]))),loc=0,scale=1)))*v.iloc[i,5]*np.sqrt(v.iloc[i,6])-v.iloc[i,4])/v.iloc[i,4]*-1

这给了我以下结果:

  for i in range(0,2,1):
      v['k'] = bisection(f,a,b,N)

如您所见,它为'x'找到正确的值,但仅为第二行找到。第一行的结果是4.50 ..当我将代码更改为:

D   P   h     O       Q SD  LT    k
80  27  0.37  50     2  3   1.51 3.814891
50  27  0.25  50     2  3   0.03 3.814891

我得到:

  for i in range(0,1,1):
      v['k'] = bisection(f,a,b,N)

所以我想要的结果是:

D   P   h     O      Q  SD  LT    k
80  27  0.37  50     2  3   1.51 4.503648
50  27  0.25  50     2  3   0.03 4.503648

我该如何实现?

我也尝试通过将'f'更改为:

D   P   h     O      Q  SD  LT    k
80  27  0.37  50     2  3   1.51 4.503648
50  27  0.25  50     2  3   0.03 3.814891

并尝试使用以下代码进行迭代:

f = lambda x: norm.ppf(1-(v.Q*v.P*v.h)/(2*v.D*x))*v.SD*np.sqrt(v.LT)*v.P*v.h+np.sqrt(2*v.D*v.O*v.P*v.h)-v.D*x*(((-(norm.ppf(1-(v.Q*v.P*v.h)/(2*x*v.D))))*(1-norm.cdf((norm.ppf(1-(v.Q*v.P*v.h)/(2*x*v.D))),loc=0,scale=1))+(norm.pdf((norm.ppf(1-(v.Q*v.P*v.h)/(2*x*v.D))),loc=0,scale=1)))*v.SD*np.sqrt(v.LT)-v.Q)/v.Q*-1

但是然后我得到了错误:

 for index, row in df.iterrows():
     v.append(bisection(f,a,b,N))

有人可以帮助我吗?

二等分函数的代码:

  ValueError: The truth value of a Series is ambiguous. Use a.empty, 
  a.bool(), a.item(), a.any() or a.all().

1 个答案:

答案 0 :(得分:2)

您的代码:

    for i in range(0,2,1):
        v['k'] = bisection(f,a,b,N)

只需将新列“ k”的所有值设置为每次迭代中二等分函数计算出的任何值

创建一个序列并将其分配给新行“ k”,也许是这样的

    v['k'] = pd.Series([bisection(f,a,b,N) for i in range(2)], index = v.index)