preprocessing.MinMaxScaler 和 preprocessing.normalize return 空值数据帧

preprocessing.MinMaxScaler and preprocessing.normalize return dataframe of Nulls

我有一个以浮点数作为数据的dataframe,我想对数据进行归一化,所以我先把它转换成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%)?我该如何修复此错误并避免输出为零?

已编辑

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

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

我试着让值从 0.0 到 1.0

这不是错误,它的发生是因为您试图将 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.