<p>@Divakar刚刚发布了一个非常好的答案。如果已经定义了类别数组,我将使用@Divakar的答案。如果你没有已经定义的唯一值,我会用我的。在</p>
<hr/>
<p>我将使用<a href="https://pandas.pydata.org/pandas-docs/stable/generated/pandas.factorize.html" rel="nofollow noreferrer"><strong>^{<cd1>}</strong></a>来分解类别。然后使用<a href="https://docs.scipy.org/doc/numpy/reference/generated/numpy.bincount.html" rel="nofollow noreferrer"><strong>^{<cd2>}</strong></a>,并将<code>weights</code>参数设置为<code>values</code>数组</p>
<pre><code>f, u = pd.factorize(valcats)
np.bincount(f, values).astype(values.dtype)
array([ 1, 12, 7, 14, 13, 8])
</code></pre>
<p><code>pd.factorize</code>还生成<code>u</code>变量中的唯一值。我们可以将结果与<code>u</code>对齐,以确定我们得到了正确的解决方案。在</p>
^{pr2}$
<p>您可以使用<code>pd.Series</code>使其更加明显</p>
<pre><code>f, u = pd.factorize(valcats)
pd.Series(np.bincount(f, values).astype(values.dtype), u)
101 1
301 12
201 7
102 14
302 13
202 8
dtype: int64
</code></pre>
<hr/>
<p><strong>为什么<a href=“https://pandas.pydata.org/pandas-docs/stable/generated/pandas.factorize.html“rel=”nofollow noreferrer“/></strong><code>pd.factorize</code><strong>而不是<a href=”https://docs.scipy.org/doc/numpy/reference/generated/numpy.unique.html“rel=”nofollow noreferrer“/></strong><code>np.unique</code><strong>?</strong></p>
<p>我们可以用</p>
<pre><code> u, f = np.unique(valcats, return_inverse=True)
</code></pre>
<p>但是,<code>np.unique</code>对值进行排序,并在<code>nlogn</code>时间内运行。另一方面,<code>pd.factorize</code>不排序,并且以线性时间运行。对于较大的数据集,<code>pd.factorize</code>将主导性能。在</p>