我有一个熊猫数据框架,其中包含一列我想要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)应用到熊猫数据帧的列中并使其忽略nan值的正确方法是什么?对于无法规范化的值,我希望它与原始列的尺寸相同
编辑:也许最好的解决方案是使用np.nanscipy.stats.nanmean?我不明白为什么需要为scipy.stats.nanstd更改自由度:
zscore = lambda x: (x - scipy.stats.nanmean(x)) / scipy.stats.nanstd(x)

最佳答案

那么,pandas'mean的版本会把std交给你,这样你就可以用这种方法来计算(为了得到与scipy zscore相同的结果,我认为你需要在Nan上使用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

关于python - 如何使用nans规范化pandas列的zscore?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23451244/

10-12 16:41