Значение из итерационной функции в пандах - PullRequest
0 голосов
/ 18 мая 2018

У меня есть фрейм данных, и я хотел бы, чтобы значения в одном столбце устанавливались с помощью итеративной функции, как показано ниже.

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)

Я получаю сообщение об ошибке "ValueError: Истинное значение Series являетсянеоднозначно. Используйте a.empty, a.bool (), a.item (), a.any () или a.all (). "Как я могу запустить функцию для каждой строки, чтобы решить проблему серии / неоднозначности?

РЕДАКТИРОВАТЬ: Добавлен ожидаемый результат.

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: я пропустил n+=1 в цикле while.добавил его сейчас.

EDIT3: я пытаюсь применить

f(0) = e^-col4
f(n) = col4 * f(n-1) / n for n > 0

до f> col2 и затем вернуть значение n в строке.

Ответы [ 2 ]

0 голосов
/ 18 мая 2018

Для чего это стоит, вот неэффективное решение: после каждой итерации отслеживайте, какой коэффициент начинает удовлетворять условию.

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'])
0 голосов
/ 18 мая 2018

Используя предоставленную вами информацию, кажется, это решение:

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)
...