擅长:python、mysql、java
<p>这是我想到的</p>
<pre><code>df = pd.DataFrame(dict(A=list('babbaa'), B=list('zxyxzy')))
A, B = df.A.values, df.B.values
</code></pre>
<p>使用<a href="https://docs.scipy.org/doc/numpy/reference/generated/numpy.unique.html" rel="nofollow noreferrer">^{<cd1>}</a>逆(所有相对位置的索引值)。你知道吗</p>
<pre><code>u, iv = np.unique(A, return_inverse=True)
</code></pre>
<p>使用反向和广播为每个组创建一行,其中每行都是该组的布尔掩码。你知道吗</p>
<pre><code>is_ = np.arange(len(u))[:, None] == iv
</code></pre>
<p>循环行并用更新的值重新分配位置跟踪数组<code>i</code>。你知道吗</p>
<pre><code>i = np.arange(len(df))
for r in is_:
i[r] = i[r][df.B.values[r].argsort()]
</code></pre>
<p>使用新位置值</p>
<pre><code>df.iloc[i]
</code></pre>
<p><a href="https://i.stack.imgur.com/JfhQh.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/JfhQh.png" alt="enter image description here"/></a></p>
<hr/>
<p>目前,我不知道如何摆脱这个循环。你知道吗</p>