我有一个风险数值组成的投资组合数据集。我想要按下面数据框中的 "Port" 列进行分组,然后将该组 "Risk" 列中大于该组 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”的中位数22.2替换端口“a”的第三个记录,用组“b”的中位数41.6替换端口“b”的第四个记录。
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
where
会替换掉结果为 False 的部分,@sudhasethu。不用谢 :) 如果有帮助的话请别忘了点击接受答案(绿色勾选标志在投票图标下方)。 - yatu