加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

如何用pandas-python递归地构造一列数据帧?

发布时间:2020-12-16 22:47:13 所属栏目:Python 来源:网络整理
导读:给出这样一个数据框df: id_ val 22222 1212003 2288763 1943721 77... 我希望为df添加一个列diff,并且它的每一行等于,比方说,该行中的val减去前一行中的diff并乘以0.4然后在前一天添加diff: diff = (val - diff_previousDay) * 0.4 + diff_previousDay 并

给出这样一个数据框df:

id_      val     
22222    12
12003    22
88763    19
43721    77
...

我希望为df添加一个列diff,并且它的每一行等于,比方说,该行中的val减去前一行中的diff并乘以0.4然后在前一天添加diff:

diff = (val - diff_previousDay) * 0.4 + diff_previousDay

并且第一行中的差异等于该行中的val * 4.也就是说,预期的df应该是:

id_      val     diff   
22222    12      4.8
12003    22      11.68
88763    19      14.608
43721    77      ...

我试过了:

mul = 0.4
df['diff'] = df.apply(lambda row: (row['val'] - df.loc[row.name,'diff']) * mul + df.loc[row.name,'diff'] if int(row.name) > 0 else row['val'] * mul,axis=1) 

但得到如错误:

TypeError: (“unsupported operand type(s) for -: ‘float’ and ‘NoneType'”,‘occurred at index 1’)

你知道如何解决这个问题吗?先感谢您!

最佳答案
您可以使用:

df.loc[0,'diff'] = df.loc[0,'val'] * 0.4

for i in range(1,len(df)):
    df.loc[i,'diff'] = (df.loc[i,'val'] - df.loc[i-1,'diff']) * 0.4  + df.loc[i-1,'diff']

print (df)
     id_  val     diff
0  22222   12   4.8000
1  12003   22  11.6800
2  88763   19  14.6080
3  43721   77  39.5648

输入取决于先前步骤的结果的计算的迭代性质使矢量化复杂化.你也许可以使用apply和一个与循环执行相同计算的函数,但在幕后这也是一个循环.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读