preprocessing.MinMaxScaler和preprocessing.normalize返回Null的数据帧

时间:2015-10-28 14:48:54

标签: python pandas scikit-learn dataframe normalization

我有使用浮点数据作为数据的数据帧,我想规范化数据,所以首先我将它转换为int(否则我有错误ValueError: Input contains NaN, infinity or a value too large for dtype('float64').) 我的规范化代码:

def normalize_df():
    x = my_df.values.astype(int)
    min_max_scaler = preprocessing.MinMaxScaler()
    x_scaled = min_max_scaler.fit_transform(x)
    df = pd.DataFrame(x_scaled)
    return df

我的输出是

    0   1   2   3   4   5   6   7   8   9   ...     12  13  14  15  16  17  18  19  20  21
0   0   0   0   0   0   0   0   0   0   0   ...     0   0   0   0   0   0   0   0   0   0
1   0   0   0   0   0   0   0   0   0   0   ...     0   0   0   0   0   0   0   0   0   0
2   0   0   0   0   0   0   0   0   0   0   ...     0   0   0   0   0   0   0   0   0   0
3   0   0   0   0   0   0   0   0   0   0   ...     0   0   0   0   0   0   0   0   0   0
4   0   0   0   0   0   0   0   0   0   0   ...     0   0   0   0   0   0   0   0   0   0

发生了什么(假设我的初始数据框在某些行中包含值0但少于30%的数据帧)?如何修复此错误并使用零来避免输出?

EDITED

我的数据看起来像(有更多的列和行):

 36680            0        22498037            2266   
 0             2218        22502676               0   
 26141            0        22505885            4533   
 39009            0        22520711            4600   
 36237            0        22527171            5933   

我尝试将值设置为0.0到1.0

1 个答案:

答案 0 :(得分:1)

这不是一个错误,它正在发生,因为你试图将NaN值转换为整数,看看它是如何工作的(在我的机器上):

In [132]: a
Out[132]: array([ nan,   1.,  nan])

In [133]: a.astype(int)
Out[133]: array([-9223372036854775808,                    1, -9223372036854775808])

因此,与数据集中的其他整数相比,每个NaN的值都非常小,这会导致缩放不正确。

要解决此问题,您应该使用浮点数。在缩放之前,您需要通过一些插补来消除NaN,或者根本不删除这些不完整的样本。请看sklearn.preprocessing.Imputer