擅长:python、mysql、java
<p>需要创建一个helper列来排序,在本例中是名称组的<code>size</code>。如果您喜欢全新的RangeIndex,请添加<code>.reset_index(drop=True)</code>,如果原始索引有用,请保持原样。你知道吗</p>
<p>排序不会改变相等值内的顺序,因此第一行总是出现在<code>'Paul'</code>内的第一行</p>
<pre><code>(df.assign(s = df.groupby('name').name.transform('size'))
.sort_values('s', ascending=False)
.drop(columns='s'))
</code></pre>
<h3>输出</h3>
<pre><code> name age
0 Paul 12
3 Paul 36
4 Paul 66
2 Michael 100
5 Michael 45
1 Ryan 17
</code></pre>
<hr/>
<p>为了消除评论中引起的恐惧,这种方法非常有效。比上述方法更重要。而且你不会破坏你的初始索引。你知道吗</p>
<pre><code>import numpy as np
np.random.seed(42)
N = 10**6
df = pd.DataFrame({'name': np.random.randint(1, 10000, N),
'age': np.random.normal(0, 1, N)})
%%timeit
(df.assign(s = df.groupby('name').name.transform('size'))
.sort_values('s', ascending=False)
.drop(columns='s'))
#500 ms ± 31.6 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
%%timeit
x = list(df['name'].value_counts().index)
df.set_index('name').loc[x].reset_index()
#2.67 s ± 166 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
</code></pre>