使用Numpy在Pandas DataFrame上放置条件的同时求和

时间:2019-03-16 14:49:58

标签: python pandas numpy dataframe

我正在尝试在Pandas数据框中的一个列上放置一个条件,并且基于该条件,我想对数据框中的另一列进行累加。下面是一个更清楚的示例:假设我的DataFrame df为:

+-----------+--------------+-----+-------------+
|   Date    | daily_return | dir | size_return |
+-----------+--------------+-----+-------------+
| 2/25/2015 |    -0.000681 |  -1 |   -0.000681 |
| 2/26/2015 |      -0.0015 |  -1 |    -0.00218 |
| 2/27/2015 |    -0.003022 |  -1 |   -0.005203 |
| 3/2/2015  |     0.005776 |   1 |    0.005776 |
| 3/3/2015  |    -0.003772 |  -1 |   -0.003772 |
| 3/4/2015  |     -0.00436 |  -1 |    -0.00755 |
+-----------+--------------+-----+-------------+

只要dir中的值等于dir,我就在列dir.shift(1)上加条件,我要对列daily_return进行累加,直到dir不等于dir.shift(1),当它们不相等时,我希望daily_return等于size_return。 我用来生成上表的代码如下:

df['size_return'] = np.where(df.dir == df.dir.shift(1), 
                             df.daily_return.cumsum(axis=0), df.daily_return)

上表的问题是,我无法弄清楚为什么如果我使用上面的代码行daily_return求和,最后两行的结果是-0.00755,我应该得到-0.00813-0.003772 + -0.00436)。

上面的代码编写的逻辑中肯定有错误,我无法弄清楚我的错误吗?

第二,根据条件,我不希望size_return的每一行中只有经过过滤的数据帧的最后一行中的值。更清楚地说,这是决赛桌的样子:

+-----------+--------------+-----+-------------+
|   Date    | daily_return | dir | size_return |
+-----------+--------------+-----+-------------+
| 2/25/2015 |    -0.000681 |  -1 |             |
| 2/26/2015 |      -0.0015 |  -1 |             |
| 2/27/2015 |    -0.003022 |  -1 |   -0.005203 |
| 3/2/2015  |     0.005776 |   1 |    0.005776 |
| 3/3/2015  |    -0.003772 |  -1 |             |
| 3/4/2015  |     -0.00436 |  -1 |   -0.008132 |
+-----------+--------------+-----+-------------+

1 个答案:

答案 0 :(得分:2)

检查groupbycumsum

df.groupby((df.dir==df.dir.shift()).eq(0).cumsum()).daily_return.cumsum()
0   -0.000681
1   -0.002181
2   -0.005203
3    0.005776
4   -0.003772
5   -0.008132
Name: daily_return, dtype: float64

如果仅保留最后一个,请使用duplicated

s=(df.dir==df.dir.shift()).eq(0).cumsum()
df['New']=df.groupby(s).daily_return.cumsum().mask(s.duplicated(keep='last'),'')
df
        Date  daily_return  dir  size_return       New
0  2/25/2015     -0.000681   -1    -0.000681          
1  2/26/2015     -0.001500   -1    -0.002180          
2  2/27/2015     -0.003022   -1    -0.005203 -0.005203
3   3/2/2015      0.005776    1     0.005776  0.005776
4   3/3/2015     -0.003772   -1    -0.003772          
5   3/4/2015     -0.004360   -1    -0.007550 -0.008132