如何使用基于python列中先前值的函数创建列

我的问题


我有一个循环,它根据时间段 t-1 中的 x 在时间段 t 中为 x 创建一个值。循环真的很慢,所以我想尝试把它变成一个函数。我尝试将 np.where 与 shift() 一起使用,但我并不高兴。知道我如何能够解决这个问题吗?


谢谢!


我的代码


import numpy as np

import pandas as pd


csv1 = pd.read_csv('y_list.csv', delimiter = ',')

df = pd.DataFrame(csv1)


df.loc[df.index[0], 'var'] = 0


for x in range(1,len(df.index)):

    if df["LAST"].iloc[x] > 0:

        df["var"].iloc[x] = ((df["var"].iloc[x - 1] * 2) + df["LAST"].iloc[x]) / 3

    else:

        df["var"].iloc[x] = (df["var"].iloc[x - 1] * 2) / 3 


df

输入数据


Dates,LAST

03/09/2018,-7

04/09/2018,5

05/09/2018,-4

06/09/2018,5

07/09/2018,-6

10/09/2018,6

11/09/2018,-7

12/09/2018,7

13/09/2018,-9

输出


Dates,LAST,var

03/09/2018,-7,0.000000

04/09/2018,5,1.666667

05/09/2018,-4,1.111111

06/09/2018,5,2.407407

07/09/2018,-6,1.604938

10/09/2018,6,3.069959

11/09/2018,-7,2.046639

12/09/2018,7,3.697759

13/09/2018,-9,2.465173


长风秋雁
浏览 70回答 2
2回答

撒科打诨

您正在查看ewm:arg = df.LAST.clip(lower=0)arg.iloc[0] = 0arg.ewm(alpha=1/3, adjust=False).mean()输出:0    0.0000001    1.6666672    1.1111113    2.4074074    1.6049385    3.0699596    2.0466397    3.6977598    2.465173Name: LAST, dtype: float64

翻翻过去那场雪

您可以使用df.shift将数据框移动为默认的 1 行,并将 if-else 块转换为矢量化np.where:In [36]: dfOut[36]:         Dates  LAST  var0  03/09/2018    -7  0.01  04/09/2018     5  1.72  05/09/2018    -4  1.13  06/09/2018     5  2.44  07/09/2018    -6  1.65  10/09/2018     6  3.16  11/09/2018    -7  2.07  12/09/2018     7  3.78  13/09/2018    -9  2.5In [37]: (df.shift(1)['var']*2 + np.where(df['LAST']>0, df['LAST'], 0)) / 3Out[37]: 0         NaN1    1.6666672    1.1333333    2.4000004    1.6000005    3.0666676    2.0666677    3.6666678    2.466667Name: var, dtype: float64
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python