我正在尝试在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 |
+-----------+--------------+-----+-------------+
答案 0 :(得分:2)
检查groupby
和cumsum
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