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

标签 python pandas recursion dataframe multiple-columns

给这样一个数据框df:

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

我想在 df 中添加一列 diff,它的每一行都等于该行中的 val减去上一行的diff 乘以0.4 然后加上前一天的diff:

diff = (val - diff_previousDay) * 0.4 + diff_previousDay

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

id_      val     diff   
11111    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  11111   12   4.8000
1  12003   22  11.6800
2  88763   19  14.6080
3  43721   77  39.5648

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

关于python - 如何用pandas-python递归地构造一列数据框?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38008390/

相关文章:

python Tkinter focus_set() 在捕获按键事件时无法正常工作

python - 使用整数数据类型根据另一列的值对数据框进行排序

python - groupby 内的条件前向填充

recursion - 分区 seq - Clojure 中的递归(或一般的 Lisp)

python - 如何在 pandas 中对不同的数据帧进行分组和聚合

python - Flask 应用程序因多个进程而锁定

python - Pandas 合并复制所有行

java - 递归实现霍纳函数?

java - 递归方法是否将类属性/数据字段作为参数?

python - 无法使用Python通过outlook发送邮件