2017-07-31 70 views
0

我在Pandas中正常化数据时遇到了一些麻烦。我创建了一个模型并试图用它来预测。熊猫:数据正常化时获取0和NaN

首先,我有这样的:

_text_img_count _text_vid_count _text_link_count _text_par_count ... 
0    2    0     6 

然后我正常化如下:现在

x = numeric_df.values #returns a numpy array 
    min_max_scaler = preprocessing.MinMaxScaler() 
    x_scaled = min_max_scaler.fit_transform(x) 
    numeric_df_normalized = pd.DataFrame(x_scaled) 

numeric_df_normalized看起来是这样的:

0 1 2 3 4 5 6 7 8 9 ... 13 14 15 16 \ 
0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 ... 0.0 0.0 0.0 0.0 

    17 18 19 20 21 22 
0 0.0 0.0 0.0 0.0 0.0 0.0 

所以我失去了我列名和我的数值全部为0.

最后,我尝试从原来的numeric_df加回旧列名称如下:

numeric_df_normalized = pd.DataFrame(numeric_df_normalized, columns=numeric_df.columns) 

我回去:

_text_img_count _text_vid_count _text_link_count ... 
      NaN    NaN    NaN 

那么几个问题:

1)为什么标准化是否会导致我失去列名并将它们设置为0?

2)为什么添加从numeric_df列名称导致我的0被转换为NaN?

谢谢!

+0

什么是x(x.max()和x.min())的最小值和最大值? –

+1

1.检查最小值和最大值。 2.您正在从数据框创建数据框...最好使用这个:numeric_df_normalized = pd.DataFrame(x_scaled,columns = numeric_df.columns) –

回答

1

如果你想变换的结果与相同结构的数据框,你可以这样做:

numeric_df_normalized.columns=numeric_df.columns 
numeric_df_normalized.index=numeric_df.index 

(第二行是如果你有一个指标为好),而不是

numeric_df_normalized = pd.DataFrame(numeric_df_normalized, columns=numeric_df.columns) 

关于0,如果第一行中的值是每个特征的最小可能值,则可能会发生这种情况。然后将它们在缩放时它们将被转化为0

例如,考虑下面的归一化:

from sklearn import preprocessing 

df=pd.DataFrame({'a':[1,2],'b':[3,4]}) 

min_max_scaler = preprocessing.MinMaxScaler() 
x_scaled = min_max_scaler.fit_transform(df.values) 

x_scaled

array([[ 0., 0.], 
     [ 1., 1.]]) 

所以左上1成为0(由于1 < 2)并且右上角3变为0(因为3 < 4)。

1

1)为什么规范化导致我失去列名并将它们设置为0?

MinMaxScaler

X_std = (X - X.min(axis=0))/(X.max(axis=0) - X.min(axis=0)) 
X_scaled = X_std * (max - min) + min 

所以当数据分钟==数据最大值,缩放后的结果为0。

2)为什么添加从numeric_df返回的列名会导致我的0被转换为NaN?

请注意,numeric_df_normalized已经是一个数据帧,所以pd.DataFrame(numeric_df_normalized, columns=numeric_df.columns)会尝试匹配当前数据帧与新列。因为没有匹配的列名称,所以产生的数据是NaN。