熊猫:规范化数据时获得0和NaN

时间:2017-07-31 18:05:34

标签: python pandas

我在Pandas中规范化数据时遇到了一些麻烦。我创建了一个模型,并试图用它来预测。

首先,我有这个:

_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?

谢谢!

2 个答案:

答案 0 :(得分: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)

  

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

因此,当数据min == data max时,缩放结果为0.

  

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

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