我有一个带有实数列的pandas数据框,我想对它进行z-score标准化:
>> 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
值会使整个数组变成nan
:
>> from scipy.stats import zscore
>> zscore(df["a"])
array([ nan, nan, nan, nan, nan, nan, nan, nan, nan, nan])
如何正确地将 zscore
(或不来自scipy的等效函数)应用于pandas dataframe的一列,并忽略nan
值?我希望它与原始列具有相同的维度,并使用np.nan
表示无法归一化的值。
编辑:也许最好的解决方案是使用scipy.stats.nanmean
和scipy.stats.nanstd
?我不明白为什么需要改变std
的自由度:
zscore = lambda x: (x - scipy.stats.nanmean(x)) / scipy.stats.nanstd(x)
return (df-df.mean())/df.std(ddof=0)``` 以及 ```df.apply(z_score)```
- Pengju Zhao