我有一个熊猫数据框架,其中包含一列我想要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.nan
和scipy.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/