Я думаю, что вы можете использовать cut или qcut для получения желаемых результатов. Cut будет создавать равномерно распределенные диапазоны, в то время как qcut создаст четное количество элементов в ячейке Qcut больше соответствует квантилям.
Вот мой код:
#Recreate your dataset
df = pd.DataFrame(
{
'permno':[10057, 10137,10153, 10225, 10233, 10241],
'price':[18.125, 23.75,9.75, 45.875,57.625, 30.875],
'mv':[7.898875e+04, 1.130191e+06, 1.226550e+05,2.530740e+06,1.670894e+06, 5.742132e+06 ],
'yearmonth':[198301, 198301,198302,198302, 198303,198303]
},
index=[1752, 4732, 6144, 7869, 8267, 8692]
)
#Create a column for the classification.
df['Quantiles']= df.groupby(['yearmonth'])['mv'].transform(
lambda x: pd.qcut(x, 5, labels=(0.2, 0.4,.6,.8,1.0))
)
Отсюда вы можете фильтровать транзакции. Я думаю, что предоставленный вами набор данных слишком мал, но для большого набора данных этот код должен работать нормально.