列和行之间的操作同时进行Pandas

时间:2017-02-18 21:19:12

标签: python pandas dataframe

我遇到一个问题,我知道这可能很简单,但让我很头疼。

我有一个pandas数据帧,我想生成一个列,其中包含同一行中的一个值和一个行中的一个值 - 1,此外,我想在行中加一个值 - 1并将其放入实际行。到目前为止,我有这个:

                      AAPL         GLD  AAPL_cumu_rtn  GLD_cumu_rtn  AAPL_Dly_rtn  \
Date
2011-01-03  329.570000  138.000000     100.000000    100.000000           NaN
2011-01-04  331.290012  134.750000     100.521896     97.644928      0.005219
2011-01-05  334.000008  134.369995     101.344178     97.369562      0.008180
2011-01-06  333.729988  133.830002     101.262247     96.978262     -0.000808
2011-01-07  336.120003  133.580002     101.987439     96.797103      0.007162

            GLD_Dly_rtn  AAPL_invest  GLD_invest

2011-01-03          NaN     650000.0    350000.0
2011-01-04    -0.023551          0.0         0.0
2011-01-05    -0.002820          0.0         0.0
2011-01-06    -0.004019          0.0         0.0
2011-01-07    -0.001868          0.0         0.0

我想填写APPL_invest和GLD_invest列,这些列是前一行中AAPL_invest乘以AAPL_Dly_rtn并与自身相加等等......

                      AAPL         GLD  AAPL_cumu_rtn  GLD_cumu_rtn  AAPL_Dly_rtn  \
Date
2011-01-03  329.570000  138.000000     100.000000    100.000000           NaN
2011-01-04  331.290012  134.750000     100.521896     97.644928      0.005219
2011-01-05  334.000008  134.369995     101.344178     97.369562      0.008180
2011-01-06  333.729988  133.830002     101.262247     96.978262     -0.000808
2011-01-07  336.120003  133.580002     101.987439     96.797103      0.007162

            GLD_Dly_rtn  AAPL_invest  GLD_invest

2011-01-03          NaN     650000.0    350000.0
2011-01-04    -0.023551     653392.3    341757.1
2011-01-05    -0.002820     658737.1    340793.3
2011-01-06    -0.004019          0.0         0.0
2011-01-07    -0.001868          0.0         0.0

如果有人对如何在不使用for循环的情况下做到这一点有任何想法,我会赞成!

非常感谢!!!!

1 个答案:

答案 0 :(得分:1)

我认为可以使用.cumprod完成此操作。

例如,如果我们选择(df['GLD_Dly_rtn'] + 1).fillna(1)然后使用.cumprod()。我们将收益标准化,然后可以简单地乘以初始投资,因此对于黄金来说,这将是。

df['GLD_total'] = (df['GLD_Dly_rtn'] + 1).fillna(1).cumprod() * 350000

此处的fillna部分仅用于填充初始NaN。

结果是:

0    350000.000000
1    341757.150000
2    340793.394837
3    339423.746183
4    338789.702625

这可能有更整洁或更普遍的方式,但我现在无法想到它

编辑:

我刚刚意识到您已在数据框中拥有累积返回列,因此您只需使用: df['GLD_total'] = (df['GLD_cumu_rtn'] / 100) * 350000