Воспроизведение вашего тестового образца:
text = """rate a.status
(0.0,0.05] 20 4
(0.05,0.1] 20 7
(0.05,0.1] 21 2
(0.05,0.1] 11 1
(0.1,0.15] 20 2
(0.1,0.15] 21 1
(0.15,0.2] 20 2
(0.15,0.2] 21 1
(0.3,0.35] 20 2
(0.35,0.4] 20 2
(0.45,0.5] 20 2
(0.55,0.6] 20 1
(0.6,0.65] 20 1 """
d = pd.read_csv(io.StringIO(text), sep="\s+").reset_index()
Шаги для выполнения расчетов:
1) groupby by index
2) выберите данные с необходимым rate
3) разделите на сумму внутри группы
Код:
rate = 20
d.groupby("index").apply(lambda x:
x.loc[x["rate"] == rate, "a.status"] / x["a.status"].sum())
Результат:
index
(0.0,0.05] 0 1.000000
(0.05,0.1] 1 0.700000
(0.1,0.15] 4 0.666667
(0.15,0.2] 6 0.666667
(0.3,0.35] 8 1.000000
(0.35,0.4] 9 1.000000
(0.45,0.5] 10 1.000000
(0.55,0.6] 11 1.000000
(0.6,0.65] 12 1.000000