小编典典

如何使用Nans将zscore归一化pandas列?

python

我有一个熊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.nanmeanscipy.stats.nanstd?我不明白为什么std为此需要更改自由度:

zscore = lambda x: (x - scipy.stats.nanmean(x)) / scipy.stats.nanstd(x)

阅读 146

收藏
2020-12-20

共1个答案

小编典典

pandas'的版本meanstd将到手的Nan,所以你可以只计算这样(得到相同SciPy的zscore我认为你需要使用ddof =
0上std):

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
2020-12-20