如何使用pandas-python递归构造数据帧的列?


问题内容

给这样一个数据框df

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

我想添加一列diffdf,并且它的每一行等于,让我们说,在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 :(“不支持的操作数类型-:’float’和’NoneType’“,’发生在索引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与功能与循环进行相同计算的函数一起使用,但是在幕后这也将是循环。