我有一个熊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:
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,并且具有无法归一化的值
zscore
np.nan
编辑 :也许最好的解决方案是使用scipy.stats.nanmean和scipy.stats.nanstd?我不明白为什么std为此需要更改自由度:
scipy.stats.nanmean
scipy.stats.nanstd
std
zscore = lambda x: (x - scipy.stats.nanmean(x)) / scipy.stats.nanstd(x)
井pandas'的版本mean和std将到手的Nan,所以你可以只计算这样(得到相同SciPy的zscore我认为你需要使用ddof = 0上std):
pandas'
mean
Nan
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