我在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?
谢谢!
答案 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?
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。