如何使用nans对pandas列进行zscore标准化?

问题描述 投票:0回答:5

我有一个 pandas 数据框,其中包含一列我想要 zscore 标准化的实际值:

>> a
array([    nan,  0.0767,  0.4383,  0.7866,  0.8091,  0.1954,  0.6307,
        0.6599,  0.1065,  0.0508])
>> df = pandas.DataFrame({"a": a})

问题是单个

nan
值使得所有数组
nan
:

>> from scipy.stats import zscore
>> zscore(df["a"])
array([ nan,  nan,  nan,  nan,  nan,  nan,  nan,  nan,  nan,  nan])

zscore
(或不是来自 scipy 的等效函数)应用于 pandas 数据框的列并让它忽略
nan
值的正确方法是什么?我希望它与原始列具有相同的尺寸,对于无法标准化的值,
np.nan

编辑:也许最好的解决方案是使用scipy.stats.nanmean

scipy.stats.nanstd
?我不明白为什么需要为此目的更改 
std
 的自由度:

zscore = lambda x: (x - scipy.stats.nanmean(x)) / scipy.stats.nanstd(x)
    
python numpy pandas scipy
5个回答
28
投票
好吧,

pandas'

mean
std
版本将提供
Nan
,所以你可以这样计算(为了获得与scipy zscore相同的结果,我认为你需要在
std
上使用ddof = 0) :

df['zscore'] = (df.a - df.a.mean())/df.a.std(ddof=0) print df a zscore 0 NaN NaN 1 0.0767 -1.148329 2 0.4383 0.071478 3 0.7866 1.246419 4 0.8091 1.322320 5 0.1954 -0.747912 6 0.6307 0.720512 7 0.6599 0.819014 8 0.1065 -1.047803 9 0.0508 -1.235699
    

7
投票
我不确定这个参数是什么时候存在的,因为我使用python的时间不长。但你可以简单地使用参数

nan_policy = 'omit' 并且 nan 在计算中会被忽略:

a = np.array([np.nan, 0.0767, 0.4383, 0.7866, 0.8091, 0.1954, 0.6307, 0.6599, 0.1065, 0.0508]) ZScore_a = stats.zscore(a,nan_policy='omit') print(ZScore_a) [nan -1.14832945 0.07147776 1.24641928 1.3223199 -0.74791154 0.72051236 0.81901449 -1.0478033 -1.23569949]
    

6
投票
您可以使用

isnan

 忽略 nan。

z = a # initialise array for zscores z[~np.isnan(a)] = zscore(a[~np.isnan(a)]) pandas.DataFrame({'a':a,'Zscore':z}) Zscore a 0 NaN NaN 1 -1.148329 0.0767 2 0.071478 0.4383 3 1.246419 0.7866 4 1.322320 0.8091 5 -0.747912 0.1954 6 0.720512 0.6307 7 0.819014 0.6599 8 -1.047803 0.1065 9 -1.235699 0.0508
    

0
投票
此问题的另一种替代解决方案是在计算 z 分数时用列均值填充 DataFrame 中的 NaN。这将导致 NaN 被计算为 z 分数为 0,然后可以在原始 df 上使用

notna

 来屏蔽掉。 

您可以创建一个与原始 df 尺寸相同的 DataFrame,其中在一行中的相同位置包含原始 df 值和 NaN 的 z 分数:

zscore_df = pd.DataFrame(scipy.stats.zscore(df.fillna(df.mean())), index=df.index, columns=df.columns).where(df.notna())
    

0
投票
以防万一其他人偶然发现这篇旧文章,scipy 的 zscore 函数现在有一个参数“nan_policy”。如果您将其设置为“省略”,它将忽略计算中的 NaN。

© www.soinside.com 2019 - 2024. All rights reserved.