我有一个数据框,并希望通过迭代函数设置一列中的值,如下所示。
import pandas as pd
import numpy as np
d = {'col1': [0.4444, 25.4615],
'col2': [0.5, 0.7],
'col3': [7, 7]}
df = pd.DataFrame(data=d)
df['col4'] = df['col1'] * df['col3']/4
def func(df):
a = np.exp(-df['col4'])
n = 1
while df['col2'] < a:
a = a + df['col4'] * 4 / n
n += 1
return n
df['col5'] = func(df)
我收到错误消息&#34; ValueError:系列的真值是不明确的。使用a.empty,a.bool(),a.item(),a.any()或a.all()。&#34;如何运行每行函数来解决序列/歧义问题?
编辑:添加了预期的输出。
out = {'col1': [0.4444, 25.4615],
'col2': [0.5, 0.7],
'col3': [7, 7],
'col4': [0.7777, 44.557625],
'col5': [0, 49]}
dfout = pd.DataFrame(out)
我不确定col4和col5中的值是什么,但根据我试图复制的计算结果将是值。
EDIT2:我在while循环中错过了n+=1
。现在加了。
EDIT3:我正在尝试申请
f(0) = e^-col4
f(n) = col4 * f(n-1) / n for n > 0
直到f&gt; col2然后返回每行n的值。
答案 0 :(得分:0)
使用您提供的信息,这似乎是解决方案:
import pandas as pd
import numpy as np
d = {'col1': [0.4444, 25.4615],
'col2': [0.5, 0.7],
'col3': [7, 7]}
df = pd.DataFrame(data=d)
df['col4'] = df['col1'] * df['col3']/4
def func(df):
n = 1
return n
df['col5'] = func(df)
答案 1 :(得分:0)
对于它的价值,这是一个效率低下的解决方案:在每次迭代后,跟踪哪个系数开始满足条件。
import pandas as pd
import numpy as np
d = {'col1': [0.4444, 25.4615],
'col2': [0.5, 0.7],
'col3': [7, 7]}
df = pd.DataFrame(data=d)
df['col4'] = df['col1'] * df['col3']/4
def func(df):
a = np.exp(-df['col4'])
n = 1
ns = [None] * len(df['col2'])
status = a > df['col2']
for i in range(len(status)):
if ns[i] is None and status[i]:
ns[i] = n
# stops when all coefficients satisfy the condition
while not status.all():
a = a * df['col4'] * n
status = a > df['col2']
n += 1
for i in range(len(status)):
if ns[i] is None and status[i]:
ns[i] = n
return ns
df['col5'] = func(df)
print(df['col5'])