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()
子类,这样就可以累积应用函数。