Pandas:累积函数应用

3

考虑一个使用pandas的简单dataframe示例:

df = pd.DataFrame({'x' : [10, 20, 30, 40]}, index = ['0','1','2', '3'])

这将得到以下结果:
index x
0     10
1     20
2     30
3     40

我试图获取x的值,并通过一个lambda为每一行生成一个结果,该结果还利用了前一行的计算。也就是说,我想根据x[i+1]y[i]的值来计算y[i+1]。例如:

y[i+1] = sin(x[i+1]) + (15 * y[i])

所以这将会得到以下的 DataFrame:
index x  y
0     10 -0.54
1     20 -7.2
2     30 -109.7
3     40 -1644.7

对于第一行,这可能是一个特殊情况(因为没有y[-1])?所以我想给它一个具体的数字。

我一直在尝试使用expanding_apply来解决这个问题,但是没有成功。谢谢。

更新

所以我通过以下方式回答了我的问题(感谢下面的帮助):

df.loc[:,'y'] = 0
initial_y_val = 10

for i in range (0, df.shape[0]):
    if i == 0 : df.iloc[0,1] = initial_y_val + df.iloc[0,0] 
    else      : df.iloc[i,1] = df.iloc[i,0] + df.iloc[(i-1),1] 

print df

这将会得到:
    x    y
0  10   20
1  20   40
2  30   70
3  40  110

所以我的问题是,是否有更加惯用(和更快)的方法来实现相同的结果?

请点击这里查看 https://dev59.com/GF4b5IYBdhLWcg3wfx5J - luca
1个回答

1

你可以使用 pandas 中的 cumsum 解决问题:

df['y'] = df.x.cumsum()

In [171]: df
Out[171]:
    x    y
0  10   10
1  20   30
2  30   60
3  40  100

编辑:

非常好的问题,您可以通过开发y1,y2,...,yn来看出它是sin(x)的增长多项式,其系数是15的幂。我建议通过迭代DataFrame索引来实现此解决方案:

z = df.x.map(math.sin)

df['y']=[sum(z[:i]*15**np.arange(int(i)+1)[::-1]) for i,r in df.iterrows()]

In [258]: df
Out[258]:
    x            y
0  10    -0.544021
1  20    -7.247371
2  30  -109.698603
3  40 -1644.733929

谢谢。理想情况下,我想在cumsum中添加一个lambda。因此,要得到y,我需要取x并应用一些函数。 - Anthony W
1
你想做什么,而你已经有一个简单的现有解决方案? - Colonel Beauvel
很好的问题@ColonelBeauvel-我认为我的问题不够清晰。因此,我进行了编辑,希望能使事情更加清晰...... - Anthony W
太好了。谢谢。如果索引是DateTime类型,这该怎么办? - Anthony W

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接