执行StandardScaler后将NaN分配给-1

时间:2018-06-17 14:21:22

标签: python pandas dataframe scikit-learn

我想 StandardScaler (通过SK学习)某些DataFrame,其中包含大量 NaN 值,并且在执行此缩放器转换后,我想分配所有{{1到-1。我们知道StandardScaler无法使用NaN值,这怎么可能?

如果还有其他解决方案(不依赖于 Scikit Learn ),请提及。

NaN

我收到以下错误消息:

df = pd.DataFrame(StandardScaler().fit_transform(values_to_scale.values))

1 个答案:

答案 0 :(得分:2)

处理NaN值并不是那么简单。它需要在采取任何进一步措施来处理NaN值之前对数据进行分析。有多种方法可以处理这些缺失值(以下不是详尽的列表):

  • 忽略缺失值altogther :此方法存在的问题是缺少的行可能包含其他列中的重要信息而忽略它们会导致分析不完整
  • 将其替换为其他值:这是常用方法之一,但选择要用于替换的值会影响整体分析。你可以用say mean替换它们,或者说你知道在整个列中都不会出现的占位符值(如-1)。

  • 使用回归代替值

  • **使用KNN取代值**

您可以查看以下链接,以获得更好的主意

另外,您可以查看official sklearn documentation for imputing missing values

更新:您可以像这样执行StandardScalar时忽略NaN值

import numpy as np    
import pandas as pd
from sklearn.preprocessing import StandardScaler

#Create a dataframe
df = pd.DataFrame({'col1': [0, np.nan, 2, 3, np.nan, 4, 5, np.nan, 6, 7, np.nan]})

#Get the index of null values
null_values = d['col1'].isnull()

#Perform standard scalar on only non-NaN values
df.loc[~null_values, ['col1']] = StandardScaler().fit_transform(df.loc[~null_values, ['col1']])

<强>输出

    col1
0   -1.728498
1   NaN
2   -0.832240
3   -0.384111
4   NaN
5   0.064018
6   0.512148
7   NaN
8   0.960277
9   1.408406
10  NaN

然后使用df.fillna

填充nan值
df.fillna(-1)

<强> outout

    col1
0   -1.728498
1   -1.000000
2   -0.832240
3   -0.384111
4   -1.000000
5   0.064018
6   0.512148
7   -1.000000
8   0.960277
9   1.408406
10  -1.000000