<p>让我们试试这个:</p>
<pre><code>smax = lambda x: x[x.rank(ascending = False) == 2]
smax.__name__ = 'secondMax'
tmax = lambda x: x[x.rank(ascending = False) == 3]
tmax.__name__ = 'thirdMax'
df_out = df.groupby(['id1','id2']).agg(['max','min',smax, tmax])
df_out.columns = [f'{i}_{j}' for i,j in df_out.columns]
df_out = df.merge(df_out, on=['id1','id2'])
df_out = df_out.where(df_out.astype(bool))
df_out
</code></pre>
<p>输出:</p>
<pre><code> id1 id2 c1 c2 c1_max c1_min c1_secondMax c1_thirdMax c2_max c2_min c2_secondMax c2_thirdMax
0 1 a1 5 3 34 5 9 6 32 2 4 3
1 1 a1 6 2 34 5 9 6 32 2 4 3
2 1 a1 9 4 34 5 9 6 32 2 4 3
3 1 a1 34 32 34 5 9 6 32 2 4 3
4 2 b1 5 2 23 5 5 NaN 43 2 2 NaN
5 2 b1 23 43 23 5 5 NaN 43 2 2 NaN
6 3 3a 234 435 234 234 NaN NaN 435 435 NaN NaN
</code></pre>