为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

长风秋雁 2022-05-24 16:20:40
我的问题我有一个循环,它根据时间段 t-1 中的 x 在时间段 t 中为 x 创建一个值。循环真的很慢,所以我想尝试把它变成一个函数。我尝试将 np.where 与 shift() 一起使用,但我并不高兴。知道我如何能够解决这个问题吗?谢谢!我的代码import numpy as npimport pandas as pdcsv1 = pd.read_csv('y_list.csv', delimiter = ',')df = pd.DataFrame(csv1)df.loc[df.index[0], 'var'] = 0for 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,LAST03/09/2018,-704/09/2018,505/09/2018,-406/09/2018,507/09/2018,-610/09/2018,611/09/2018,-712/09/2018,713/09/2018,-9输出Dates,LAST,var03/09/2018,-7,0.00000004/09/2018,5,1.66666705/09/2018,-4,1.11111106/09/2018,5,2.40740707/09/2018,-6,1.60493810/09/2018,6,3.06995911/09/2018,-7,2.04663912/09/2018,7,3.69775913/09/2018,-9,2.465173
查看完整描述

2 回答

?
撒科打诨

TA贡献1934条经验 获得超2个赞

您正在查看ewm:


arg = df.LAST.clip(lower=0)

arg.iloc[0] = 0

arg.ewm(alpha=1/3, adjust=False).mean()

输出:


0    0.000000

1    1.666667

2    1.111111

3    2.407407

4    1.604938

5    3.069959

6    2.046639

7    3.697759

8    2.465173

Name: LAST, dtype: float64


查看完整回答
反对 回复 2022-05-24
?
翻翻过去那场雪

TA贡献2065条经验 获得超13个赞

您可以使用df.shift将数据框移动为默认的 1 行,并将 if-else 块转换为矢量化np.where:


In [36]: df

Out[36]: 

        Dates  LAST  var

0  03/09/2018    -7  0.0

1  04/09/2018     5  1.7

2  05/09/2018    -4  1.1

3  06/09/2018     5  2.4

4  07/09/2018    -6  1.6

5  10/09/2018     6  3.1

6  11/09/2018    -7  2.0

7  12/09/2018     7  3.7

8  13/09/2018    -9  2.5


In [37]: (df.shift(1)['var']*2 + np.where(df['LAST']>0, df['LAST'], 0)) / 3

Out[37]: 

0         NaN

1    1.666667

2    1.133333

3    2.400000

4    1.600000

5    3.066667

6    2.066667

7    3.666667

8    2.466667

Name: var, dtype: float64


查看完整回答
反对 回复 2022-05-24
  • 2 回答
  • 0 关注
  • 69 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信