我使用的数据有一些空值,我想使用knn Imputation来估算Null值。为了有效地估算我想要归一化数据。
normalizer = Normalizer() #from sklearn.preprocessing
normalizer.fit_transform(data[num_cols]) #columns with numeric value
错误:输入包含NaN,无穷大或对于dtype来说太大的值(' float64')。
那么我如何规范化具有NaN的数据
答案 0 :(得分:1)
我建议不要在sklearn中使用normalize,因为它不处理NaN。您只需使用以下代码来规范化您的数据。
df['col']=(df['col']-df['col'].min())/(df['col'].max()-df['col'].min())
上面的方法忽略了NaNs,同时将数据去除了
答案 1 :(得分:0)
此方法将所有列标准化为[0,1],NaN仍为NaN
def norm_to_zero_one(df):
return (df - df.min()) * 1.0 / (df.max() - df.min())
例如:
[In]
df = pd.DataFrame({'A': [10, 20, np.nan, 30],
'B': [1, np.nan, 10, 5]})
df = df.apply(norm_to_zero_one)
[Out]
A B
0 0.0 0.000000
1 0.5 NaN
2 NaN 1.000000
3 1.0 0.444444
df.max()
和df.min()
返回每列的最大值和最小值。
答案 2 :(得分:0)
sklearn.preprocessing.Normalizer大约不是0的平均值,而是1 stdev规范化,与迄今为止的其他答案一样。 Normalizer()关于将行缩放为单位范数,例如到improve clustering或原始问题归因。您可以了解差异here和here。要缩放行,您可以尝试执行以下操作:
MyEntity
如果Google(像我一样)将您带到这里,并且您希望使用estimator API将列标准化为0均值,1 stdev,则可以使用sklearn.preprocessing.StandardScaler。它可以处理NaN(在sklearn 0.20.2上测试,我记得它在某些旧版本上不起作用。)
import numpy as np
A = np.array([[ 7, 4, 5, 7000],
[ 1, 900, 9, nan],
[ 5, -1000, nan, 100],
[nan, nan, 3, 1000]])
#Compute NaN-norms
L1_norm = np.nansum(np.abs(A), axis=1)
L2_norm = np.sqrt(np.nansum(A**2, axis=1))
max_norm = np.nanmax(np.abs(A), axis=1)
#Normalize rows
A_L1 = A / L1_norm[:,np.newaxis] # A.values if Dataframe
A_L2 = A / L2_norm[:,np.newaxis]
A_max = A / max_norm[:,np.newaxis]
#Check that it worked
L1_norm_after = np.nansum(np.abs(A_L1), axis=1)
L2_norm_after = np.sqrt(np.nansum(A_L2**2, axis=1))
max_norm_after = np.nanmax(np.abs(A_max), axis=1)
In[182]: L1_norm_after
Out[182]: array([1., 1., 1., 1.])
In[183]: L2_norm_after
Out[183]: array([1., 1., 1., 1.])
In[184]: max_norm_after
Out[184]: array([1., 1., 1., 1.])