如何在python

时间:2018-01-16 07:09:51

标签: python dataframe normalize

我使用的数据有一些空值,我想使用knn Imputation来估算Null值。为了有效地估算我想要归一化数据。

normalizer = Normalizer() #from sklearn.preprocessing
normalizer.fit_transform(data[num_cols]) #columns with numeric value

错误:输入包含NaN,无穷大或对于dtype来说太大的值(' float64')。

那么我如何规范化具有NaN的数据

3 个答案:

答案 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或原始问题归因。您可以了解差异herehere。要缩放行,您可以尝试执行以下操作:

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.])