У меня есть датафрейм портфелей с номерами рисков.Я хочу сгруппировать по столбцу «Порт» в кадре данных ниже, а затем заменить значения в столбце «Риск», если он превышает квантиль 95% своей группы, на медиану этой группы портфеля
df =
Date Port Risk
2019-04-30 a 21.8
2019-03-29 a 22.6
2019-02-28 a 500
2019-01-31 a 26.1
2019-04-30 b 36.4
2019-03-29 b 43.3
2019-02-28 b 40
2019-01-31 b 364
Я пробовал приведенный ниже код, который я нашел в stackoverflow, но он не работает.
def replace(group):
q = group.quantile(0.95)
outlier = group>q
group[outlier] = group.median()
return group
df.groupby('Port').transform(replace)
Также пробовал
q = pd.DataFrame(df.groupby('Port')['Risk'].quantile(0.95))
df.loc[(((q.loc[df.Port,'Risk']<df['Risk'].values)))]=q.loc[df.Port,'Risk']
Ожидаемый результат - заменатретья запись порта "a" с медианой группы "a", которая составляет 22,2, и четвертая запись порта "b" с медианой группы "b", которая составляет 41,6
df =
Date Port Risk
2019-04-30 a 21.8
2019-03-29 a 22.6
2019-02-28 a 22.2
2019-01-31 a 26.1
2019-04-30 b 36.4
2019-03-29 b 43.3
2019-02-28 b 40
2019-01-31 b 41.6