Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用上一个值的输出按顺序应用函数_Python_Pandas_Apply - Fatal编程技术网

Python 使用上一个值的输出按顺序应用函数

Python 使用上一个值的输出按顺序应用函数,python,pandas,apply,Python,Pandas,Apply,我想计算一个级数的“结转”。这将为每一行计算一个值,然后将其添加到先前计算的值(上一行) 我如何在熊猫身上做到这一点 decay = 0.5 test = pd.DataFrame(np.random.randint(1,10,12),columns = ['val']) test val 0 4 1 5 2 7 3 9 4 1 5 1 6 8 7 7 8 3 9 9 10 7 11 2 decayed = [] for i, v in te

我想计算一个级数的“结转”。这将为每一行计算一个值,然后将其添加到先前计算的值(上一行)

我如何在熊猫身上做到这一点

decay = 0.5
test = pd.DataFrame(np.random.randint(1,10,12),columns = ['val'])
test
    val
0   4
1   5
2   7
3   9
4   1
5   1
6   8
7   7
8   3
9   9
10  7
11  2

decayed = []
for i, v in test.iterrows():
    if i ==0:
        decayed.append(v.val)
        continue
    d = decayed[i-1] + v.val*decay
    decayed.append(d)

test['loop_decay'] = decayed
test.head()

    val loop_decay
0   4   4.0
1   5   6.5
2   7   10.0
3   9   14.5
4   1   15.0

您可以利用
pd.Series.shift()
创建带有val[i]和val[i-1]的数据帧,然后跨单个轴应用函数(本例中为1):


您可以利用
pd.Series.shift()
创建带有val[i]和val[i-1]的数据帧,然后跨单个轴应用函数(本例中为1):


考虑使用
cumsum()

但是,由于
cumsum()
包括它,因此需要减去第一个(val*decay):

test['loop_decay'] = (test.ix[0,'val']) + (test['val']*decay).cumsum() - (test.ix[0,'val']*decay)

考虑使用
cumsum()

但是,由于
cumsum()
包括它,因此需要减去第一个(val*decay):

test['loop_decay'] = (test.ix[0,'val']) + (test['val']*decay).cumsum() - (test.ix[0,'val']*decay)

虽然这段代码可能会回答这个问题,但提供关于这段代码为什么和/或如何回答这个问题的附加上下文可以提高它的长期价值。最后开始测试它-看起来这不起作用。val2需要在每次迭代时更新。这不仅仅是前一个val,它是经过转换的前一个val。抱歉,我误解了问题,@Parfait有正确的答案,而此代码可能会回答问题,提供关于此代码为什么和/或如何回答此问题的附加上下文可以提高其长期价值。最终开始测试它-看起来这不起作用。val2需要在每次迭代时更新。这不仅仅是前一个val,它是经过改造的前一个val。抱歉,我误解了这个问题,@Parfait有正确的答案,终于开始测试了,这一个确实有效-非常酷。我想pandas可能会使用一个类似于
rolling()
cumulative()
子类,这样你就可以累积应用函数了。最后,我开始测试了,这个确实有效——非常酷。我想pandas可以使用类似于
rolling()
cumulative()
子类,这样就可以累积应用函数。