给这样一个数据框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/