Сначала получите маску из верхних значений в каждой группе.Затем получите размер замаскированного DataFrame.
m = df.groupby(['Itr', 'Type'])['Values'].transform(lambda x: x.isin(x.drop_duplicates().nlargest(2)))
df.where(m).groupby(['Itr', 'Type', 'Values']).size()
Itr Type Values
2.0 1.0 20.399 3
20.402 2
3.0 1.0 20.342 1
20.348 5
2.0 20.043 5
20.058 4
dtype: int64
Альтернативно с groupby
+ value_counts
, затем sort
и groupby
+ tail
, чтобы сохранить 2 самых больших значения в пределахгруппы.
(df.groupby(['Itr', 'Type'])['Values'].value_counts()
.sort_index(level=2)
.groupby(level=[0, 1]).tail(2))
Itr Type Values
3 2 20.043 5
20.058 4
1 20.342 1
20.348 5
2 1 20.399 3
20.402 2
Name: Values, dtype: int64