擅长:python、mysql、java
<p><a href="https://docs.scipy.org/doc/scipy-0.16.0/reference/generated/scipy.stats.rankdata.html" rel="nofollow noreferrer">^{<cd1>}</a>在这里可以帮忙。为了得到每个元素在其bucket中的秩,我们采用“min”和“ordinal”方法之间的差异:</p>
<pre><code>>>> from scipy.stats import rankdata as rd
>>> rd(df.A, 'ordinal') - rd(df.A, 'min')
array([0, 0, 1, 1, 2, 2, 3, 4])
</code></pre>
<p>那么我们就比较一下<code>df.A.map(selDict)</code>:</p>
<pre><code>df.C = (rd(df.A, 'ordinal') - rd(df.A, 'min') < df.A.map(selDict)).astype(int)
</code></pre>
<p>这可能有点低效(调用rankdata两次),但是在scipy中使用优化的例程应该可以弥补这一点。你知道吗</p>
<p>如果您不能使用scipy,您可以对“ordinal”方法使用repeated<code>argsort()</code>,对“min”方法使用my solution<code>unique</code>和<code>bincount</code>:</p>
<pre><code>>>> _, v = np.unique(df.A, return_inverse=True)
>>> df.A.argsort().argsort() - (np.cumsum(np.concatenate(([0], np.bincount(v)))))[v]
0 0
1 0
2 1
3 1
4 2
5 2
6 3
7 4
Name: A, dtype: int64
</code></pre>
<p>然后与上面的<code>df.A.map(selDict)</code>进行比较。你知道吗</p>