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

前端之家收集整理的这篇文章主要介绍了如何用pandas-python递归地构造一列数据帧?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

给出这样一个数据框df:

  1. id_ val
  2. 11111 12
  3. 12003 22
  4. 88763 19
  5. 43721 77
  6. ...

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

  1. diff = (val - diff_prevIoUsDay) * 0.4 + diff_prevIoUsDay

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

  1. id_ val diff
  2. 11111 12 4.8
  3. 12003 22 11.68
  4. 88763 19 14.608
  5. 43721 77 ...

我试过了:

  1. mul = 0.4
  2. 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’)

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

最佳答案
您可以使用:

  1. df.loc[0,'diff'] = df.loc[0,'val'] * 0.4
  2. for i in range(1,len(df)):
  3. df.loc[i,'diff'] = (df.loc[i,'val'] - df.loc[i-1,'diff']) * 0.4 + df.loc[i-1,'diff']
  4. print (df)
  5. id_ val diff
  6. 0 11111 12 4.8000
  7. 1 12003 22 11.6800
  8. 2 88763 19 14.6080
  9. 3 43721 77 39.5648

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

猜你在找的Python相关文章