擅长:python、mysql、java
<p>可以调用<code>.lt</code>将df与标量值进行比较,然后调用<code>sum</code>两次(这是因为它首先对行进行求和)</p>
<pre><code>In [66]:
df.lt(0).sum()
Out[66]:
a 2
b 1
c 1
d 0
dtype: int64
</code></pre>
<p>再次调用<code>sum</code>对<code>Series</code>进行求和:</p>
<pre><code>In [58]:
df.lt(0).sum().sum()
Out[58]:
4
</code></pre>
<p>还可以将布尔df转换为一维数组并调用<code>np.sum</code>:</p>
<pre><code>In [62]:
np.sum((df < 0).values.ravel())
Out[62]:
4
</code></pre>
<p><strong>计时</strong></p>
<p>对于30K行df:</p>
<pre><code>In [70]:
%timeit sum(n < 0 for n in df.values.flatten())
%timeit df.lt(0).sum().sum()
%timeit np.sum((df < 0).values.ravel())
1 loops, best of 3: 405 ms per loop
100 loops, best of 3: 2.36 ms per loop
1000 loops, best of 3: 770 µs per loop
</code></pre>
<p>np方法比loop方法快约525倍,比纯pandas方法快约4倍</p>