【问题标题】:Value from iterative function in pandaspandas中迭代函数的值
【发布时间】:2018-10-28 22:05:18
【问题描述】:

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

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:系列的真值不明确。请使用 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:我在 while 循环中错过了 n+=1。现在添加它。

EDIT3:我正在申请

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

直到 f > col2 然后返回每行 n 的值。

【问题讨论】:

  • 您能否提供所需输出的示例?
  • 您的函数仍然返回一个 int 而您希望 col5 被分配一个系列,它应该是 return a 吗? while df['col2'] &lt; a 的预期语义是什么?您是否只想修改满足df['col2'][i] &lt; a[i] 的系数 i?
  • 谢谢@mcoav,但这给了我同样的理由。我想看看在每一行离开while循环之前我需要做多少次迭代,可以这么说。
  • 所以while (df['col2'] &lt; a).any(): 应该可以解决问题(如果您不介意每一行执行相同数量的迭代)。 (编辑:显然不是,感谢您的编辑)
  • 这解决了歧义问题,但我与预期值相差甚远。 (我得到 1, 1 而我期待 0, 49)

标签: pandas function numpy dataframe iteration


【解决方案1】:

使用您提供的信息,这似乎是解决方案:

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)

【讨论】:

  • 谢谢,但我不认为我已经成功地传达了我所追求的。我在 while 循环中错过了n += 1。我有一个函数,其中 f(0) = e^-col4 和 f(n) = col4 * f(n-1) / n for n > 0,因此希望在 n 增加时迭代,直到 f() 大于col2 然后返回 n。
【解决方案2】:

不管怎样,这是一个低效的解决方案:每次迭代后,跟踪哪个系数开始满足条件。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-01-14
    • 1970-01-01
    • 2019-01-14
    • 1970-01-01
    • 2018-07-05
    • 2022-01-12
    • 1970-01-01
    • 2014-04-01
    相关资源
    最近更新 更多