适当的方式来获胜但忽略了Python中的nan

时间:2017-11-03 22:33:02

标签: python

我正试图赢得一个包含NaN的熊猫系列。使用掩码可以逃避NaN,但它只在找到百分位值时逃逸NaN,然后​​用该值替换NaN,这不是我想要的。

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

直接使用winsorize会产生2,2,3,4 ......,98,99,99。我试图首先屏蔽NaN,然后​​使用winsorize,最后用NaN替换数字,最初是NaN:< / p>

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没有正确地被证实,我不明白为什么会这样。

我之所以不首先删除NaN然后使用winsorize,是因为需要保留索引。这是大型数据集的一部分,并且不会遗漏该观察的其他变量。

有没有办法(优先考虑优雅)来实现我的目标?

1 个答案:

答案 0 :(得分:2)

您需要先屏蔽它。

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,第一百分位数将是“第0.98”次观察,这基本上是“第0次”观察,因此1不被认为是获胜的。