gpt4 book ai didi

python - 在 Python 中进行 winsorize 但忽略 nan 的正确方法

转载 作者:太空宇宙 更新时间:2023-11-04 02:38:56 26 4
gpt4 key购买 nike

我正在尝试对包含 NaN 的 pandas 系列进行 winsorize。使用掩码可以转义 NaN,但它只会在找到百分位值时转义 NaN,然后​​用该值替换 NaN,这不是我想要的。

例如,df 由 1, 2, ..., 98, 99, Inf, NaN 组成。对于 (0.01, 0.01) 缩尾,结果应为 2, 2, 3, 4, ..., 98, 99, 99, NaN。

直接使用 winsorize 得到 2, 2, 3, 4, ..., 98, 99, 99。我尝试先屏蔽 NaN,然后​​ winsorize,最后用 NaN 替换原来是 NaN 的数字:

import numpy as np
import pandas as pd
from scipy.stats.mstats import winsorize
df = pd.DataFrame(list(range(1,99))+[np.Inf, np.NaN])
np.where(df.isnull(), np.nan, winsorize(np.ma.masked_invalid(df),limits=(0.01,0.01)))

但是,结果现在是 1, 2, 3, ..., 98, 99, 99, NaN。最小的数字 1 未正确调整,我不明白为什么会这样。

之所以不先drop NaNs再winsorize,是因为需要保留索引。这是大型数据集的一部分,并没有丢失该观察的其他变量。

有没有办法(最好是优雅的)来实现我的目标?

最佳答案

您需要先屏蔽它。

df = pd.DataFrame({'A':list(range(1,99))+[np.Inf, np.NaN]})
df.loc[mask, 'A'] = winsorize(df['A'].loc[mask],limits=0.10)

1 未被缩尾处理的原因是因为忽略 NaN 会将样本减少到 98,第 1 个百分位数将是“第 0.98 个”观察值,这实际上是“第 0 个”观察值,因此 1 不被视为被缩尾处理。

关于python - 在 Python 中进行 winsorize 但忽略 nan 的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47105278/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com