Pandas中首行除外的逐行计算1k增长值问题求助
解决方法
你的问题出在shift(1)只会引用原始DataFrame中上一行的growth_of_1k值,而非计算后更新的值。第三行的shift(1)对应原始的NaN,所以计算结果还是NaN,同时第一行的值会被覆盖成NaN,完全不符合需求。
这里提供两种可靠的解决方式:
方法一:逐行循环计算(直观易懂)
直接遍历从第二行开始的每一行,用上一行已经计算好的growth_of_1k值乘以(1+当年return):
for i in range(1, len(df)): df.loc[i, 'growth_of_1k'] = df.loc[i-1, 'growth_of_1k'] * (1 + df.loc[i, 'return'])
运行后你的DataFrame会变成:
| year | return | growth_of_1k |
|---|---|---|
| 2010 | 0.1 | 1000 |
| 2011 | 0.4 | 1400.0 |
| 2012 | 0.3 | 1820.0 |
方法二:利用累积乘积(更高效)
如果数据量很大,循环效率较低,可以用cumprod()计算(1+return)的累积乘积,再结合初始值生成结果:
# 获取初始的1000美元值 initial_value = df['growth_of_1k'].iloc[0] # 计算从第二年开始的(1+return)累积乘积 cumulative_growth = (1 + df['return']).iloc[1:].cumprod() # 拼接初始值和计算后的结果,替换原列 df['growth_of_1k'] = pd.concat([pd.Series([initial_value]), initial_value * cumulative_growth]).reset_index(drop=True)
这种方法和循环的计算结果完全一致,但处理大规模数据时速度更快。
内容的提问来源于stack exchange,提问作者ng150716
相关产品推荐
相关产品推荐

