<p><strong><em>设置</em></strong></p>
<pre><code>df = pd.DataFrame([
[ 1, 0, 0, 0],
[ 1, 1, 0, 0],
[ 1, 1, 1, 0],
[ 1, 1, 1, 1],
[ 0, 1, 1, 1],
[ 0, 0, 1, 1],
[ 0, 0, 0, 1],
[ 1, 0, 1, 1], # this should end up 1
[ 0, 0, 0, 0],
[-1, 0, 0, 0],
[-1, -1, 0, 0],
[-1, -1, -1, 0],
[-1, -1, -1, -1],
[ 0, -1, -1, -1],
[ 0, 0, -1, -1],
[ 0, 0, 0, -1],
], columns=['priority{}'.format(i) for i in range(1, 5)])
</code></pre>
<p><strong><em>解决方案</em></strong></p>
<pre><code>v = df.values
df.assign(Results=(v * v.cumprod(1).astype(np.bool8)).sum(1))
priority1 priority2 priority3 priority4 Results
0 1 0 0 0 1
1 1 1 0 0 2
2 1 1 1 0 3
3 1 1 1 1 4
4 0 1 1 1 0
5 0 0 1 1 0
6 0 0 0 1 0
7 1 0 1 1 1
8 0 0 0 0 0
9 -1 0 0 0 -1
10 -1 -1 0 0 -2
11 -1 -1 -1 0 -3
12 -1 -1 -1 -1 -4
13 0 -1 -1 -1 0
14 0 0 -1 -1 0
15 0 0 0 -1 0
</code></pre>
<p>它的工作原理</p>
<p>抓取<code>numpy</code>数组</p>
<pre><code>v = df.values
</code></pre>
<p>使用<code>True</code>表示非零</p>
<pre><code>v.astype(np.bool8)
</code></pre>
<p>每个连续的列继续是非零的</p>
<pre><code>v.astype(np.bool8).cumprod(1)
</code></pre>
<p>乘以<code>v</code>过滤出要加的数,然后求和</p>
<pre><code>(v * v.astype(np.bool8).cumprod(1)).sum()
</code></pre>
<p>原始时间测试
<em>小数据</em></p>
<p><a href="https://i.stack.imgur.com/JoD9b.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/JoD9b.png" alt="enter image description here"/></a></p>
<p><em>大数据</em></p>
<p><a href="https://i.stack.imgur.com/O4dus.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/O4dus.png" alt="enter image description here"/></a></p>