擅长:python、mysql、java
<pre><code>def null_blocks(x, n):
isnull = np.isnan(x.values)
nextnot = np.append(~isnull[1:], True)
csum = isnull.cumsum()
return np.diff(csum[isnull & nextnot]).max() >= n
def which_ids(k):
return [n for n, g in df.groupby('participant_id').summary if null_blocks(g, k)]
</code></pre>
<p><strong><em>演示</em></strong></p>
^{pr2}$
<p>它的工作原理</p>
<ul>
<li><code>null_blocks</code>
<ul>
<li>我从一个布尔序列开始,其中的值是<code>NaN</code>和{<cd3>}</li>
<li>由于<code>bool</code>是<code>int</code>的一个子类,我们可以用<code>cumsum</code>来总结它们</li>
<li>然后我们可以通过取<code>isnull</code>的否定并将其移动一个空格来确定块的结束位置。当<code>nextnot</code>和{<cd7>}都是<code>True</code>时,这是块的结尾。在</li>
<li>然后,我将<code>csum</code>与块末端的位置进行切片,并取其差异。。。这给出了块的大小。在</li>
<li>如果块的最大大小大于阈值,则返回<code>True</code></li>
</ul></li>
<li><code>which_ids</code>
<ul>
<li>对<code>groupby</code>对象使用列表理解</li>
<li>只返回<code>groupby</code>组本身的块大小大于阈值的名称。在</li>
</ul></li>
</ul>