<p>我想,我找到了一个非常简洁的解决方案:</p>
<pre><code>df['c_a'] = df.groupby('F_Date').apply(lambda grp:
25000 - grp.col.where(grp.is_B.eq(1), 0).shift(fill_value=0)
.cumsum()).reset_index(level=0, drop=True)
</code></pre>
<p>结果是:</p>
<pre><code> F_Date B_Date col is_B c_a
0 01/09/2019 02/08/2019 2200 1 25000
1 01/09/2019 03/08/2019 672 1 22800
2 02/09/2019 03/08/2019 1828 1 25000
3 01/09/2019 04/08/2019 503 0 22128
4 02/09/2019 04/08/2019 829 1 23172
5 03/09/2019 04/08/2019 1367 0 25000
6 02/09/2019 05/08/2019 559 1 22343
7 03/09/2019 05/08/2019 922 1 25000
8 04/09/2019 05/08/2019 1519 0 25000
9 01/09/2019 06/08/2019 376 1 22128
</code></pre>
<p>这个想法,以小组<em>F_Date=='01/09/2019'</em>为例:</p>
<ol>
<li><p><code>grp.col.where(grp.is_B.eq(1), 0)</code>-要从中减去的值
组中下一行:</p>
<pre><code>0 2200
1 672
3 0
9 376
</code></pre></li>
<li><p><code>.shift(fill_value=0)</code>-从<strong>电流中减去的值
组中的行:</p>
<pre><code>0 0
1 2200
3 672
9 0
</code></pre></li>
<li><p><code>.cumsum()</code>-要减去的累积值:</p>
<pre><code>0 0
1 2200
3 2872
9 2872
</code></pre></li>
<li><p><code>25000 - ...</code>-目标值:</p>
<pre><code>0 25000
1 22800
3 22128
9 22128
</code></pre></li>
</ol>