我有一个带有风险数字的投资组合数据框。我想通过下面数据框中的“端口”列进行分组,然后用该投资组合组的中位数替换“风险”列中大于其组的 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