pandas中迭代函数的值

时间:2018-05-18 12:50:27

标签: pandas function numpy dataframe iteration

我有一个数据框,并希望通过迭代函数设置一列中的值,如下所示。

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的值。

2 个答案:

答案 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'])